对于某些结构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,编译器可以(并且可以)简单地优化它,而不在堆栈上分配空间。

如果我像您一样尝试仅打印ab的地址,这就是我得到的:

ffeb7448 (&a)
ffeb7444 (&b)


即相差4个字节。

如果我也尝试打印s1的地址(因此最终使用声明s1结束),这就是我得到的结果:

ffe109cc (&a)
ffe109c8 (&s1)
ffe109c4 (&b)


您可以看到它实际上确实位于ab之间(并且不必总是如此,因为其他答案已经指出),并且ab分开为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.  */
}


在这里,ab在我的机器的编译器上被8个字节分隔,即使每个foo实际上只使用5个字节。

这说明:在编写代码时,切勿假设任何与宽度,对齐方式,相对位置等有关的内容。

关于c - 了解C中的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11292729/

10-10 20:55