对于某些结构splab
:
int main() {
int a;
struct splab *s1;
int b;
printf("%x\n",&a);
printf("%x\n",&b);
return 0;
}
我认为我应该打印第二张纸:
bfc251e8 - 8
(即,说明s1
占用的空间)。相反,我得到了:
bfc251e8
bfc251ec
为什么?
最佳答案
这不仅与变量的顺序有关。您从不使用s1
,编译器可以(并且可以)简单地优化它,而不在堆栈上分配空间。
如果我像您一样尝试仅打印a
和b
的地址,这就是我得到的:
ffeb7448 (&a)
ffeb7444 (&b)
即相差4个字节。
如果我也尝试打印
s1
的地址(因此最终使用声明s1
结束),这就是我得到的结果:ffe109cc (&a)
ffe109c8 (&s1)
ffe109c4 (&b)
您可以看到它实际上确实位于
a
和b
之间(并且不必总是如此,因为其他答案已经指出),并且a
和b
分开为8个字节的4。另外一点与对齐有关:
例如:
struct foo
{
int a;
char b;
};
虽然此结构看起来在具有4个字节整数的计算机上可能是5个字节宽,但我的编译器说
sizeof (struct foo) == 8
。这样,
foo
始终以8字节边界对齐(这包括使用struct foo
局部变量)。例如
int bar (void)
{
struct foo a;
struct foo b;
/* Do some work. */
}
在这里,
a
和b
在我的机器的编译器上被8个字节分隔,即使每个foo
实际上只使用5个字节。这说明:在编写代码时,切勿假设任何与宽度,对齐方式,相对位置等有关的内容。
关于c - 了解C中的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11292729/