C怎么可能unsignedint只需要两个字节?

我在玩指针,我注意到一件奇怪的事情。

我有一个结构如下:

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];并将其中的每条数据设置为 0memset(els,0,5*sizeof(list_element));

现在我正在尝试使用以下代码查看它们的内存位置:

printf("%p start location of elsn", &(els));
printf("%p start location of els->xn", &(els->x));
printf("%p start location of els->yn", &(els->y));
printf("%p start location of els->zn", &(els->z));
printf("%p start location of els->next(pointer)n", &(els->next));
printf("%p start location of els+1n", &(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。

回答

这些数字是十六进制的。0x7ffeeba4a978和之间的差0x7ffeeba4a980不是 2,而是 8。

为了防止您的下一个问题,它是 8 而不是 4 的原因可能是由于对齐要求。许多 64 位系统要么要求要么更喜欢将它们的 8 字节指针与 8 字节边界对齐,即对齐为 8 的倍数的地址(因此它们的最低有效十六进制数字是80)。所以编译器在z和之间留下了 4 个字节的填充next来实现这一点。


以上是C怎么可能unsignedint只需要两个字节?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>