使用union变量分配两个值
变量a由值10赋值,变量b由变量v赋值为20,然后它给出的输出为20而不是10.我得不到它。
#include int main() { union var { int a, b; }; union var v; va=10; vb=20; printf("%d\n", va); return 0; }
我执行了程序,输出为20。
union
将所有列出的成员叠加在一起(尽管有些可能比重叠的初始部分扩展得更远),因此分配给.a
或.b
正在写入内存的同一部分。 考虑到这一点,输出应该是有意义的。
如果您期望输出为10,那么您可能正在考虑struct
的行为。
在真正扭曲的场景中,可以将不同值的部分同时存储在并集中,但通常会部分覆盖的值被认为是损坏的。 例如,这个:
union { char a; struct { char ba; char bb; } b; } s;
可以同时存储sa
和sbbb
,但由于sa
与sbba
重叠,因此分配给sbba上的sa
sbba
,并暗示所有sb
不再值得信赖。
通常,用于存储不同类型的联合会嵌入到一个结构中,该结构的第一个成员记录了正在使用的联合成员:
struct { int type; union { char ch; int n; } datum; } atom;
这里, type
可能包含一个枚举值,用于指示datum.ch
或datum.n
是否在atom中使用。
这是一个有启发性的问题。 尝试撤消分配,如下所示:
vb=20; va=10;
并看到结果。 如果你想让a
和b
共存而不是相互叠加,那么使用一个结构,如:
#include int main() { struct var { int a, b; }; struct var v; va=10; vb=20; printf("%d\n", va); return 0; }
你应该得到想要的结果。 但是,var结构现在包含两个整数。
在联合中,您可以分配一个值。 在联合中,值彼此重叠。 所以你在为两个union元素赋值时做错了。 它将始终显示最后指定的值。 因此,如果您正在访问a的值,它将显示上次更新的值。
union
在这两种方式上与struct
不同:
- 为当前最大的类型分配空间(因为它们都是
int
,整体联合的大小是int
) - 任何时候,
union
中只能存储一个值 。
存储到v
的最后一个值是20
,因此在打印任何union
成员时应该期望该值返回。
如果您想要访问这两个成员,那么您可能希望使用struct
。
你应该阅读关于union
:
- http://en.wikipedia.org/wiki/Union_type
- http://www.go4expert.com/articles/unions-c-powerful-feature-c-t15/
- 为什么我们需要C联盟?
这将帮助您了解会发生什么 – 基本上所有union
成员都存储在内存中的相同地址。
让我们假设,原始int大小是32位。
C / C ++中联合数据类型的概念是:它使我们能够在同一个内存位置存储不同的数据类型。 我们可以定义一个包含许多成员的联合, 但在任何给定时间只能有一个成员包含一个值。 联合的大小足以包含其中最大的成员。
在你的情况下:’a’和’b’都是int类型,因此’var’联合的大小是32位。
现在想象一下32个大小的二进制数组。 让我们说A [32]。 至少5个有效位存储01010,即分配给’v.a’的二进制forms10。 接下来当你将20分配给’v.b’时,10100(20的二进制forms)将取代01010。所以目前联合v在其内存空间中有10100。
当您访问’v.a’时,它将返回该内存位置的当前值。
请参阅链接维基百科链接