2015-10-18 53 views
0

我想知道是否有一个很好的方法来解决这个问题,而不需要做大量的副本。C++ - reinterpret_cast从缓冲区键入

比方说,我有一个字节缓冲区,我保存了很多东西。我将正确保存4个字节的整数在那里和浮动等。

现在,如果我的整数保存在缓冲区中的位置0x0001,有没有办法我可以创建一个int *并将其指向该位置?

我曾尝试:

int* ptr = reinterpret_cast<int*>(&data.dataPtr); 

和dataPtr是const char*其中OFC持有地址在缓冲区内我的整数。

在我的转换ptr保存dataPtr的地址后,当我解引用ptr时,它会打印dataPtr的地址。我应该再次使用static_cast或reinterpret_cast来获取整数吗?

这甚至可能没有遇到未定义的行为?

回答

1

有没有办法保证这个工作,但你可以使它在某些编译器和系统上工作。

首先,你可能想投data.dataPtr而不是&data.dataPtr。你想指向data.dataPtr指向的缓冲区,对吗?不是指针变量本身。其次,如果dataPtrconst,那么您也应该使ptr为const,以确保一定的安全性。所以我们有:

const int* ptr = reinterpret_cast<const int*>(data.dataPtr); 

这仍然有一些问题。

data.dataPtr不能存储与int对齐的地址,在这种情况下,它可能无法工作。有些系统支持错位指针,有些则不支持。在那些做的事情上,它往往很慢。

data.dataPtr可能无法存储足够的数据来组成int

如果到目前为止,int的确切值将根据系统的字节顺序而有所不同。

有时候可以使用系统或编译器的特定行为,但只有当你确切地知道你在做什么以及它为什么会起作用时才是可以接受的。

要以标准投诉的方式执行此操作,您必须逐个抓取字节,并使用位移将它们组合成int

您还应该知道指针别名。

+0

哦,男人欢呼,我很困惑自己很多,你是最好的。 – Mamma