C指针算术sizeof(struct)

end*_*mac 7 c struct sizeof

这是有问题的代码

#include <stdio.h>

struct test {
    unsigned char t;
    unsigned short u;
    unsigned char v;
};


int main ()
{
    struct test  * a = (void *) 0x1000;

    printf("%x %p %p\n",
           sizeof(struct test),
           a + sizeof(struct test),
           a - sizeof(struct test));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

sizeof(struct test)打印6,所以我希望看到:

6 0xffa 0x1006

相反,我得到了

6 0x1024 0xfdc
Run Code Online (Sandbox Code Playgroud)

我上次检查时,0x24或36,不等于6.它甚至没有与我能说的任何东西对齐.我完全失去了.

有人可以向我解释为什么我会得到这些价值观吗?

Mys*_*ial 17

问题是当你进行指针运算时,它会增加数据类型大小的倍数.

所以你实际上正在做的是增加广场sizeof(struct test).

因为sizeof(struct test) = 6,您正在递增地址6 * 6 = 36.因此,为什么你得到0x10240xfdc不是0x10060xffa.(您也切换+-,但是这是一个很小的事情.)

相反,只需这样做:

printf("%x %p %p\n",
       sizeof(struct test),
       a + 1,
       a - 1);
Run Code Online (Sandbox Code Playgroud)