以下代码的输出.. 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;
}
答
通过工会的定义是:你不能同时使用v.a
和v.b
,因为这两个领域共享同一个地址。引用标准:
甲联合类型描述重叠 非空集合构件的对象,其中每个 具有任选指定 名和可能的不同类型。
在这里,只要您分配到v.b
,就会覆盖v.a
。在你的情况下,因为两个变量都具有相同的类型,所以事情不会变得很难看,但是想象一下,如果a
是一个字符例如float
和b
。
如果你的目标是让var
是包含两种不同int
复合变量,那么你应该使用struct
,不union
。
答
联合将足够宽以存储其包含的最宽类型,并且类型将共享相同的地址。如果你想a
和b
不同,请使用struct
。
C99标准,部分6.7.2.1:
工会的大小是苏夫网络cient包含最大的成员。在 的值中,大多数成员可以随时存储在联合对象中。一个指向 联合对象的指针,经过适当转换后,指向其每个成员(或者如果成员是位域,则指向其所在的单位),反之亦然。
从6.5.8章节:
全部指向同一个工会对象的成员比较平等的。
答
联合是一种可以使用不同类型的modifires访问相同的内存的东西。所以在你的代码中,第一个分配没有多少意义,因为第二个分配存在。它以最后一个顺序影响内存,所以你得到最后的分配值。
您在发布之前是否阅读过'union'的定义? – ruslik 2010-11-20 15:43:50