变量 a 由值 10 分配,变量 b 由 20 与联合变量 v 分配。然后它给出 a 的输出是 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;
}
我执行了程序,得到了 20 作为输出。
union
将所有列出的成员重叠在一起(尽管有些成员可能比重叠的初始部分延伸得更远),因此分配给其中一个.a
或.b
正在写入内存的同一部分。考虑到这一点,输出应该是有意义的。
struct
如果您期望输出为 10,您可能正在考虑' 的行为。
在真正扭曲的场景中,可能会将不同值的一部分同时存储在一个联合中,但通常会假定部分覆盖的值已损坏。例如,这个:
union {
char a;
struct { char ba; char bb; } b;
} s;
可以同时存储s.a
和s.b.bb
,但由于s.a
重叠s.b.ba
,分配给s.a
stomps s.b.ba
,并且暗示 all ofs.b
不再可信。
通常用于存储不同类型的联合将嵌入到一个结构中,该结构的第一个成员记录正在使用的联合成员:
struct {
int type;
union {
char ch;
int n;
} datum;
} atom;
在这里,type
可能会包含一个枚举值来指示是否datum.ch
或datum.n
正在使用原子。
一次在联合中,您可以分配一个值。在联合中,这些值相互重叠。所以你在为联合的两个元素赋值时做错了。它将始终显示最后分配的值。因此,如果您正在访问 a 的值,它将显示最后更新的值。
这是一个有启发性的问题。尝试反转分配,如:
v.b=20;
v.a=10;
并查看结果。如果你想a
和b
共存而不是相互重叠,那么使用一个结构,如:
#include<stdio.h>
int main()
{
struct var
{
int a, b;
};
struct var v;
v.a=10;
v.b=20;
printf("%d\n", v.a);
return 0;
}
你应该得到想要的结果。但是,var 结构现在包含两个整数。
A在以下两个方面union
与 a不同:struct
int
,所以联合的整体大小为int
)union
任何时候都只能存储一个值。您存储到的最后一个值v
是20
,因此在打印union
.
如果您想同时访问这两个成员,那么您需要使用 astruct
来代替。
你应该阅读union
:
这将帮助您了解发生了什么 - 基本上 a 的所有成员union
都存储在内存中的相同地址。
让我们假设,原始 int 大小是 32 位。
C/C++中联合数据类型的概念是:它使我们能够将不同的数据类型存储在同一个内存位置。我们可以定义一个包含许多成员的联合,但在任何给定时间只有一个成员可以包含一个值。工会的规模足以容纳其最大的成员。
在您的情况下:“a”和“b”都是 int 类型,因此“var”联合的大小是 32 位。
现在想象一下大小为 32 的二进制数组。让我们说它A [32]。最低 5 个有效位存储 01010,即分配给“va”的 10 的二进制形式。接下来,当您将 20 分配给“vb”时,10100(20 的二进制形式)将替换 01010。所以目前联合 v 的内存空间中有 10100。
当您访问“va”时,它会返回该内存位置的当前值。
查看链接维基百科链接