这是有问题的代码
#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.因此,为什么你得到0x1024而0xfdc不是0x1006和0xffa.(您也切换+和-,但是这是一个很小的事情.)
相反,只需这样做:
printf("%x %p %p\n",
sizeof(struct test),
a + 1,
a - 1);
Run Code Online (Sandbox Code Playgroud)