以下代码的输出.. Union

问题描述:

任何人都可以请解释我为什么下面的代码打印20而不是10?以下代码的输出.. Union

感谢

#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; 
} 
+2

您在发布之前是否阅读过'union'的定义? – ruslik 2010-11-20 15:43:50

通过工会的定义是:你不能同时使用v.av.b,因为这两个领域共享同一个地址。引用标准:

甲联合类型描述重叠 非空集合构件的对象,其中每个 具有任选指定 名和可能的不同类型。

在这里,只要您分配到v.b,就会覆盖v.a。在你的情况下,因为两个变量都具有相同的类型,所以事情不会变得很难看,但是想象一下,如果a是一个字符例如floatb

如果你的目标是让var是包含两种不同int复合变量,那么你应该使用struct,不union

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

C99标准,部分6.7.2.1:

工会的大小是苏夫网络cient包含最大的成员。在 的值中,大多数成员可以随时存储在联合对象中。一个指向 联合对象的指针,经过适当转换后,指向其每个成员(或者如果成员是位域,则指向其所在的单位),反之亦然。

从6.5.8章节:

全部指向同一个工会对象的成员比较平等的。

联合是一种可以使用不同类型的modifires访问相同的内存的东西。所以在你的代码中,第一个分配没有多少意义,因为第二个分配存在。它以最后一个顺序影响内存,所以你得到最后的分配值。