[英]Output of the following code.. Union
谁能解释一下为什么下面的代码显示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;
}
根据并集的定义:您不能同时使用va
和vb
因为两个字段共享相同的地址。 引用标准:
联合类型描述了一组重叠的非空成员对象 ,每个成员对象都有一个可选的指定名称和可能不同的类型。
在这里,一旦您分配给vb
,您将覆盖va
。 在您的情况下,事情不会变得很难看,因为两个变量具有相同的类型,但仅想象一下如果a
是float
而b
是char怎么办。
如果您的目标是使var
为包含两个不同int
的复合变量,则应使用struct
而不是union
。
联合将足够宽以存储它包含的最广泛的类型,并且这些类型将共享相同的地址。 如果要使a
和b
区分,请使用struct
。
根据C99标准的6.7.2.1节:
工会的规模足以容纳其最大的成员。 成员中最多一个的值可以随时存储在联合对象中。 指向经过适当转换的并集对象的指针指向其每个成员(或者,如果一个成员是一个字段,则指向它所驻留的单元),反之亦然。
从6.5.8节开始:
指向同一联合对象的成员的所有指针比较相等。
联合是一种提供对具有不同类型修改的相同内存的访问的东西。 因此,在您的代码中,第一次分配没有太多意义,因为存在第二次分配。 它以最后顺序影响内存,因此您将获得最后分配的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.