联合变量的对齐

时间:2011-12-24 15:32:00

标签: c unions

  

可能重复:
  A question about union in C

假设以下代码:

#include <stdio.h>

int main()
{
    union a
    {
        int i;
        char ch[2];
    };
    union a u;
    u.ch[0]=3;
    u.ch[1]=2;
    printf("%d, %d, %d\n", u.ch[0], u.ch[1], u.i);
    return 0;
}

我想知道为什么ch[0]ch[1]在联合的低位地址上。在堆栈中如果我有一个Little Endian字节,它们应该在更高阶的地址上。任何人都可以解释一个联盟的记忆表示吗?

2 个答案:

答案 0 :(得分:3)

由于所有成员都放在union所占用的内存块的开头,因此union应该对齐,以便它的所有成员都对齐。

答案 1 :(得分:0)

这就是工会的运作方式。它与endianess无关 每个工会成员都从工会开始的​​地址开始,并根据需要获取。因此ch[0]将采用第一个地址。

仅当整数类型占用两个或更多字节时,Endianess才有意义。然后,最重要的字节可以是第一个或最后一个。但是这里有两个字符,第一个是第一个,第二个是第二个。