从void指针读取 - reinterpret_cast好吗?

时间:2014-10-14 06:23:27

标签: c++

我一直在调试我的代码已经有一段时间了,我需要一个健全性检查,reinterpret_cast不是问题。我用了C / C ++已经有一段时间了,我可能会忘记基础知识。

在我的函数中,我获得了一些通用数据void *data从传入的其他参数中,我知道数据的大小以及某些类型被偏移的位置。例如,data的大小为12个字节:前4个字节为int,后4个字节为字符,后4个字节为int。

问题: 我如何从数据中获取每个数据的和平(int,char,char,char,char,int)?到目前为止,我一直在使用reinterpret_cast并且它有效!但是,这样的实例可以出现在我的值(memFirst4,memA,memB等)不是我预期的地方,因为我正在使用reinterpret_cast吗?

void *data = malloc((sizeof(int)*3)); // 12 bytes .. my compiler has ints as 4 bytes
int first4 = 8075;
char a = 'a';
char b = 'b';
char c = 'c';
char d = 'd';
int last4 = 981;
memcpy(data,&first4,sizeof(int)); // copy first4 into memory
memcpy(data+sizeof(int)+sizeof(char)*1,&a,sizeof(char)); // copy char a into memory
memcpy(data+sizeof(int)+sizeof(char)*2,&b,sizeof(char)); // copy char b into memory
memcpy(data+sizeof(int)+sizeof(char)*3,&c,sizeof(char)); // copy char c into memory
memcpy(data+sizeof(int)+sizeof(char)*4,&d,sizeof(char)); // copy char d into memory
memcpy(data+sizeof(int)+sizeof(char)*4+sizeof(int),&last4,sizeof(int)); // copy last4 into memory

int memFirst4 = *reinterpret_cast<int *>(data);
char memA = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*1);
char memB = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*2);
char memC = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*3);
char memD = *reinterpret_cast<char *>(data+sizeof(int)+sizeof(char)*4);
int memLast4 = *reinterpret_cast<int *>(data+sizeof(int)+sizeof(char)*4+sizeof(int));
free(data);

2 个答案:

答案 0 :(得分:1)

您的解决方案可行,但风险很大(容易出错,复制一个字节或更少)。因此,我会建议工会:

#pragma pack(1)
union myData
{ 
  char data[12];
  struct fields 
    { 
      uint8_t i[4];
      char c[4];
      uint8_t i2[4];
    } u_fields;
}
#pragma pack(pop) 

Union允许您读取与不同类型相同的内存块(在本例中使用char [12]数据和字段struct)。

Have a look here for more info

答案 1 :(得分:0)

你不应该使用reinterpret_cast。使用reinterpret_cast不允许使用来自void *的一些指针。

如果要从void *转换为其他内容,可以使用static_cast。但请记住,在两者之间使用void *从一种类型转换为另一种类型(不同)类型将产生一个未指定的指针值。