代码之家  ›  专栏  ›  技术社区  ›  arka

C语言中奇怪的联合行为

  •  0
  • arka  · 技术社区  · 2 年前
    #include <stdio.h>
    
    int main(void)
    {
      int a = 0x4565;
      long ch1;
      int ch2;
    
      printf("%p %p %p\n", &ch2, &ch1, &a);
      printf("%zu %zu %zu\n", sizeof(long), sizeof (int), _Alignof(a));
    
      return 0;
    }
    

    输出:

    0x7fffebb487dc 0x7fffebb487e0 0x7fffebb487ec
    8 4 4
    

    如果int的对齐是4,那么为什么变量的空间没有被分配到 0x7fffebb487e8 ? 为什么编译器会提供额外的4字节空间(填充)?

    只有当int是allocate after变量时才会发生这种情况,该变量的大小为8(比如pointer、long、long)。 如果前面的变量是int类型,即大小为且对齐方式为4,则编译器不提供填充。

    我很困惑。请帮帮我。 非常感谢。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Eric Postpischil    2 年前

    在没有优化的情况下,编译器会自然地分配空间,并从高地址到低地址处理堆栈,这是堆栈增长的方向。

    它从一个以0(十六进制)结尾的对齐地址开始,为每个地址分配四个字节 a ,把它放在以C结尾的地址。然后 long ch1 ,它必须跳过四个字节才能到达以0结尾的八字节对齐地址。最后,为了 ch2 ,它只减去四个字节。

    当你打开优化时,会使用更智能的算法。