任何人都可以解释一下为什么下面的代码会打印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;
}
答案 0 :(得分:3)
根据联盟的定义:您不能同时使用v.a
和v.b
,因为这两个字段共享相同的地址。引用标准:
联合类型描述重叠 非空的成员对象集,每个 其中有一个可选的指定 名称和可能不同的类型。
此处,只要您分配到v.b
,就会覆盖v.a
。在你的情况下,事情不会变得丑陋,因为两个变量都有相同的类型,但想象一下,如果a
是float
而b
是一个字符,那会是什么。
如果您的目标是让var
成为包含两个不同int
的复合变量,那么您应该使用struct
,而不是union
。
答案 1 :(得分:0)
联盟将足够宽以存储其包含的最宽类型,并且类型将共享相同的地址。如果您希望a
和b
不同,请使用struct
。
根据C99标准,第6.7.2.1节:
联合的大小足以包含其中最大的成员。 at的值 大多数成员可以随时存储在union对象中。指向a的指针 适当转换的联合对象指向其每个成员(或者如果成员有点 - 现场,然后到它所在的单位),反之亦然。
从第6.5.8节开始:
指向同一个union对象成员的所有指针都比较相等。
答案 2 :(得分:0)
Union提供对具有不同类型修改的相同内存的访问。因此,在您的代码中,第一个分配没有太多意义,因为存在第二个分配。它会以最后的顺序影响内存,因此您可以获得最后指定的值。