字节对齐的问题?

发布于 2022-09-07 16:02:58 字数 591 浏览 40 评论 0

代码

#include <stdio.h>

struct test{
    int i;
    short c;
    char *p;
};
int main(void)
{
    struct test *pt = NULL;
    printf("%p\n", &(pt->i));
    printf("%p\n", &(pt->c));
    printf("%p\n", &(pt->p));
    printf("%lu\n", sizeof(struct test));
    return 0;
}

Windows 10 x64上
编译输出了一下,发现size是16个字节

PS C:\Users\salamander\Desktop> ./test
0000000000000000
0000000000000004
0000000000000008
16

p的起始位置为什么变成了0000000000000008呢?
猜测是short后面补了2个字节,就是4+4了,指针本身应该是8个字节

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧故 2022-09-14 16:02:58

的确是这样的.

A memory access is said to be aligned when the datum being accessed is n bytes long and the datum address is n-byte aligned. When a memory access is not aligned, it is said to be misaligned. Note that by definition byte memory accesses are always aligned.

n 字节的数据, 其地址要按照 n 字节来对齐.

int i 4字节, 默认处于处于 0, 对齐的.
short c 2字节, 默认处于 4, 对齐的.
指针 p 8字节, 默认处于 6, 没有按照8字节对齐, 所以在需要在其前面补两个字节.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文