使用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; 

可以同时存储sasbbb ,但由于sasbba重叠,因此分配给sbba上的sa sbba ,并暗示所有sb不再值得信赖。

通常,用于存储不同类型的联合会嵌入到一个结构中,该结构的第一个成员记录了正在使用的联合成员:

 struct { int type; union { char ch; int n; } datum; } atom; 

这里, type可能包含一个枚举值,用于指示datum.chdatum.n是否在atom中使用。

这是一个有启发性的问题。 尝试撤消分配,如下所示:

  vb=20; va=10; 

并看到结果。 如果你想让ab共存而不是相互叠加,那么使用一个结构,如:

 #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

这将帮助您了解会发生什么 – 基本上所有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’时,它将返回该内存位置的当前值。

请参阅链接维基百科链接