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。所以这是一个地址。
答案 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
访问它将超出内存,访问该内存时会发生什么未确定。