C++ 解引用中的指针查询

C++ 解引用中的指针查询,c++,pointers,C++,Pointers,d_buffer的内容到底是什么?打印完d_缓冲区的值后,我得到0x70820301。所以它是一个地址。(*(uint32\u t*)本地缓冲区)此处Local\u Buffer衰减为unsigned char*,它指向数组的第一个元素。您正在将其强制转换为int*,然后取消引用它。您的代码具有未定义的行为,因为数组的大小为2,而int在大多数平台中的大小至少为4。以int的形式访问它将超出内存,访问该内存时会发生什么情况是不确定的您正在设置一个2字节的本地缓冲区,值为1,3,如下所示: typ

d_buffer
的内容到底是什么?打印完d_缓冲区的值后,我得到0x70820301。所以它是一个地址。

(*(uint32\u t*)本地缓冲区)
此处
Local\u Buffer
衰减为
unsigned char*
,它指向数组的第一个元素。您正在将其强制转换为
int*
,然后取消引用它。您的代码具有未定义的行为,因为数组的大小为2,而
int
在大多数平台中的大小至少为4。以
int
的形式访问它将超出内存,访问该内存时会发生什么情况是不确定的

您正在设置一个2字节的本地缓冲区,值为1,3,如下所示:

typedef unsigned char uint8_t;
typedef int uint32_t;

uint8_t Local_Buffer[2] = {1,3};

uint32_t d_buffer;

d_buffer = ( *(uint32_t *)Local_Buffer );
然后将该值(使用
C
-style转换)转换为指向
uint32\t
的指针,取消引用该值并对结果进行排序
uint32\u t
的大小为4字节

从逻辑上讲,您可能会得到
d\u buffer
的一些值,如:

|0x01|0x03|
实际上,此强制转换读取的内容超过了数组的末尾,因此会引发未定义的行为,因此任何事情都可能发生

在您的特定情况下,您似乎正在使用预期值(0x03,0x01)以及相邻内存地址中的两个其他“随机”值填充
d_buffer


体系结构的属性将告诉您如何存储各个字节以构成
uint32\u t
值。您的
0x70820301
值显示
0x0301
按预期存储,以及
0x70820000
的“意外”垃圾值,代码具有未定义的行为,原因远比您暗示的简单且深刻。打印d_缓冲区的值后,我得到0x70820301。“所以这是一个地址。”KerrekSB,可能是我忽略了什么。你可以发布更多细节吗?@learningfellow,这肯定不是地址。我得到一些负值,但在未定义的情况下,任何事情都可能发生。@learningfellow:那不是地址。它是将四个字节的内存解释为32位整数的结果。请注意,下面的两个字节(01和03)是数组中的两个字节值;其他的是数组后面的垃圾。当然,正如其他人所说,访问垃圾会产生未定义的行为,因此原则上任何事情都可能发生?你想了解指针/类型定义/转换吗?。后者很好,如果你问so+1,你可以很容易地找到更多好的答案,建议:在显示内存内容时使用十六进制值。。。以及解释OP如何获得
0x7082
0x03
0x01
|0x01|0x03|?|?