【发布时间】:2021-04-27 02:57:02
【问题描述】:
我正在玩指针,我注意到一件奇怪的事情。
我有一个结构如下:
typedef struct list_element_struct {
uint32_t x;
uint32_t y;
uint32_t z;
struct list_element_struct *next;
}list_element;
据我所知,unsigned int 的大小是 4 个字节,指针的大小是 8 个字节。这里还有 8 个字节对齐,所以这个结构的大小是 24 个字节。
我已经使用list_element els[5]; 初始化了上述结构对象的列表,并且还使用memset(els,0,5*sizeof(list_element)); 将其中的每条数据设置为0
现在我正在尝试使用这些代码查看它们的内存位置:
printf("%p start location of els\n", &(els));
printf("%p start location of els->x\n", &(els->x));
printf("%p start location of els->y\n", &(els->y));
printf("%p start location of els->z\n", &(els->z));
printf("%p start location of els->next(pointer)\n", &(els->next));
printf("%p start location of els+1\n", &(els[1]));
我打印出来的是:
0x7ffeeba4a970 start location of els
0x7ffeeba4a970 start location of els->x
0x7ffeeba4a974 start location of els->y
0x7ffeeba4a978 start location of els->z
0x7ffeeba4a980 start location of els->next(pointer)
0x7ffeeba4a988 start location of els+1
这是奇怪的事情。为什么 els->z 只占用两个字节?它真的应该像 x 和 y 那样需要 4 个。
【问题讨论】:
-
sizeof(int)必须至少是一个,这实际上是唯一的限制。它通常是 4,但不能保证。指针也是如此,只不过现在 8 也是常见的大小。 -
看看
0x7ffeeba4a988。有一些迹象表明数字多于 0-9 ;) -
...
0x770x780x790x7a0x7b0x7c0x7d0x7d0x7e0x7fpan@98765433333336@pan > -
"据我所知,unsigned int的大小是4个字节,指针的大小是8个字节。" --> 是众多可能性之一。
标签: c struct hex offset memory-address