解除引用中的指针查询

时间:2014-06-10 13:46:40

标签: c++ pointers

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 );

最终d_buffer的内容是什么?打印d_buffer的值后,我得到0x70820301。所以这是一个地址。

2 个答案:

答案 0 :(得分:5)

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

|0x01|0x03|

然后你将该值(使用C - 样式转换)转换为指向uint32_t的指针,取消引用该结果并对其进行取消。 uint32_t的大小为4个字节。

从逻辑上讲,您可能会d_buffer获得一些值,如:

|0x01|0x03|?|?

实际上,此强制转换读取数组的末尾,因此会引发未定义的行为,因此字面上任何都可能发生。

在您的特定情况下,您会看到d_buffer填充了预期值(0x03,0x01)以及来自相邻内存地址的另外两个“随机”值。

您的架构的endianness将告诉您如何存储各个字节以构成uint32_t值的值。您0x70820301的值显示0x0301按预期存储,以及0x70820000的“意外”垃圾值。

答案 1 :(得分:2)

( *(uint32_t *)Local_Buffer );此处Local_Buffer衰减到unsigned char*,它指向数组的第一个元素。您将其强制转换为int*,然后取消引用它。您的代码具有未定义的行为,因为该数组的大小为2,其中int在大多数平台中具有至少大小4.以int访问它将超出内存,访问该内存时会发生什么未确定