输出以下代码..联盟

时间:2010-11-20 15:32:29

标签: c unions

任何人都可以解释一下为什么下面的代码会打印20而不是10?

由于

#include<stdio.h>

int main()
{
    union var
    {
        int a, b;
    };
    union var v;
    v.a=10;
    v.b=20;
    printf("%d\n", v.a);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

根据联盟的定义:您不能同时使用v.av.b,因为这两个字段共享相同的地址。引用标准:

  

联合类型描述重叠   非空的成员对象集,每个   其中有一个可选的指定   名称和可能不同的类型。

此处,只要您分配到v.b,就会覆盖v.a。在你的情况下,事情不会变得丑陋,因为两个变量都有相同的类型,但想象一下,如果afloatb是一个字符,那会是什么。

如果您的目标是让var成为包含两个不同int的复合变量,那么您应该使用struct,而不是union

答案 1 :(得分:0)

联盟将足够宽以存储其包含的最宽类型,并且类型将共享相同的地址。如果您希望ab不同,请使用struct

根据C99标准,第6.7.2.1节:

  

联合的大小足以包含其中最大的成员。 at的值   大多数成员可以随时存储在union对象中。指向a的指针   适当转换的联合对象指向其每个成员(或者如果成员有点 -   现场,然后到它所在的单位),反之亦然。

从第6.5.8节开始:

  

指向同一个union对象成员的所有指针都比较相等。

答案 2 :(得分:0)

Union提供对具有不同类型修改的相同内存的访问。因此,在您的代码中,第一个分配没有太多意义,因为存在第二个分配。它会以最后的顺序影响内存,因此您可以获得最后指定的值。