Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从空指针读取-重新解释\u cast好吗?_C++ - Fatal编程技术网

C++ 从空指针读取-重新解释\u cast好吗?

C++ 从空指针读取-重新解释\u cast好吗?,c++,C++,我已经调试了我的代码一段时间了,我需要一个健全的检查,以确保reinterpret_cast不是问题所在。我已经有一段时间没有使用C/C++了,我可能忘记了基础知识 在我的函数中,我从传入的其他参数中获得了一些通用数据void*data,我知道数据的大小以及某些类型的偏移位置。例如,data的大小为12个字节:前4个字节为int,后4个字节为chars,最后4个字节为int 问题: 如何从数据中获取每一个数据(int,char,char,char,char,int)?到目前为止,我一直在使用re

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

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

问题:
如何从数据中获取每一个数据(int,char,char,char,char,int)?到目前为止,我一直在使用
reinterpret\u 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);
void*data=malloc((sizeof(int)*3));//12字节。。我的编译器的整数为4字节
int first4=8075;
字符a='a';
字符b='b';
字符c='c';
chard='d';
int last4=981;
memcpy(data和first4,sizeof(int));//将first4复制到内存中
memcpy(data+sizeof(int)+sizeof(char)*1,&a,sizeof(char));//将字符a复制到内存中
memcpy(data+sizeof(int)+sizeof(char)*2,&b,sizeof(char));//将字符b复制到内存中
memcpy(data+sizeof(int)+sizeof(char)*3,&c,sizeof(char));//将字符c复制到内存中
memcpy(数据+sizeof(int)+sizeof(char)*4,&d,sizeof(char));//将字符d复制到内存中
memcpy(data+sizeof(int)+sizeof(char)*4+sizeof(int)和last4,sizeof(int));//将last4复制到内存中
int memFirst4=*重新解释(数据);
char memA=*重新解释(数据+sizeof(int)+sizeof(char)*1);
char memB=*重新解释(数据+sizeof(int)+sizeof(char)*2);
char memC=*重新解释(数据+sizeof(int)+sizeof(char)*3);
char memD=*重新解释(数据+sizeof(int)+sizeof(char)*4);
int memLast4=*重新解释(数据+sizeof(int)+sizeof(char)*4+sizeof(int));
免费(数据);

您不应该使用reinterpret\u cast。不允许使用reinterpret\u cast从void*强制转换某些指针


当您想从void*转换到其他对象时,可以使用static_cast。但请记住,在两种类型之间使用void*从一种类型转换为另一种(不同的)类型将产生一个未指定的指针值。

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

#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]数据和fields struct)


重新解释cast
是正确的工具。它只需要一个指针,并允许您取消引用它,就好像它是您传递的类型一样。你认为哪里会出现问题(除了
int
可能不总是4字节之外)?啊,你上一次投错了,额外的
sizeof(int)
太多了。除了第一个偏移量之外,所有的字符都是错的。@Adam:所有字符都是在1关闭的情况下写入和读取的,最后一个int是在分配的缓冲区之后写入的。@Adam抓起一些纸来,画12个方框,并为每个调用检查指针指向哪个方框。它必须始终指向您要写入或读取的内存的起始点。这样行吗?通常,
struct
s被填充,这不是在
union
s内部完成的吗?另外,他想要的是
int
,而不是
uint8\u t[4]
。我认为这对于C++11不再是真的。此外,我使用的编译器从未为C++03检查过这一点,并且标准始终保证了
p==reinterpret\u cast(reinterpret\u cast(p))