这段代码是如何工作的 - 关于c中的联合初始化?

时间:2012-03-19 21:04:54

标签: c initialization unions

我为这个节目输出了0 2 ..... 但不知道为什么?
请解释我认为只有int i用512初始化 但ch [1]如何得到值2。

#include <stdio.h>
int main()
{
    union a /* declared */
    {
        int i;   char ch[2];
    };
    union a z = { 512 };   

    printf("%d%d", z.ch[0], z.ch[1]);
    return 0;
}

5 个答案:

答案 0 :(得分:4)

Union声明表示其所有成员都分配了相同的内存。因此,您的int ichar ch[2]引用了相同的内存空间 - 换句话说,它们是别名。每当你换一个,你也会改变另一个。

现在,假设您的int是32位宽并且您使用的是像x86这样的小端系统,i = 512(512 == 0x00000200)实际上在内存中看起来像这样:< / p>

0x00  0x02  0x00  0x00.

前两个值直接对应于2个字符的数组:

ch[0] ch[1]

所以你得到ch[0] == 0x0ch[1] == 0x02

尝试设置i = 0x1234并查看它对角色阵列的影响。

根据您的问题,您可能想要使用struct而不是union - 然后其成员将按顺序分配在内存中(一个接一个)。

答案 1 :(得分:3)

512是十六进制的0x200,所以你的联合的第一个字节是0,第二个是2.如果你没有指定应该初始化哪个联合成员,那么将采用第一个,你的int

你的字符串的第二个字节得到2,因为ch的第一个字节初始化为0,第二个字节为2。

答案 2 :(得分:1)

简单:512 =二进制1000000000,因此ch [0]将获得8个零(假设您的系统是小端)并且ch [1]将获得10个部分,其中十进制为2。

答案 3 :(得分:1)

你将'struct'与'union'混合在一起。在union中,您可以将不同类型和命名的数据收集到一个字段中(lenght = maximum(数据大小)),您可以访问该字段,并确保自己获得正确的数据。

你的例子为max(int,char [2])分配内存 如果你说z.i = 32或z.ch [0] =''

,这没什么区别

答案 4 :(得分:0)

你有0 2有充分的理由,但C标准说没有定义行为。如果你写i,那么ch的值在理论上可以是任何东西。

然而,gcc确保数据将很好地对齐。