变量a由值10赋值,变量b由20用union变量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。
答案 0 :(得分:6)
union
将所有列出的成员叠加在一起(尽管有些成员可能比重叠的初始部分延伸得更远),因此分配到.a
或.b
正在写入记忆的同一部分。考虑到这一点,输出应该是有意义的。
如果你期望输出为10,你可能会考虑struct
的行为。
在真正扭曲的场景中,可以将不同值的部分同时存储在并集中,但通常会将部分覆盖的值设置为损坏。例如,这个:
union {
char a;
struct { char ba; char bb; } b;
} s;
可以同时存储s.a
和s.b.bb
,但由于s.a
重叠s.b.ba
,所以s.a
上的s.b.ba
踩踏,并暗示所有s.b
都不再值得信赖。
通常,用于存储不同类型的联合会嵌入到一个结构中,该结构的第一个成员记录了正在使用的联合成员:
struct {
int type;
union {
char ch;
int n;
} datum;
} atom;
在这里,type
可能包含一个枚举值,以指示原子中是否使用了datum.ch
或datum.n
。
答案 1 :(得分:1)
这是一个有启发性的问题。尝试撤消作业,如下:
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结构现在包含两个整数。
答案 2 :(得分:1)
一次加入你可以分配一个值。在联合中,值彼此重叠。所以你在为两个union元素赋值时做错了。它将始终显示最后指定的值。因此,如果您要访问a的值,它将显示上次更新的值。
答案 3 :(得分:0)
union
与struct
的不同之处在于以下两种方式:
int
,整体联合的大小为int
)union
中。您存储在v
中的最后一个值是20
,因此在打印union
的任何成员时,应该会返回该值。
如果您想要访问这两个成员,那么您可能希望使用struct
。
答案 4 :(得分:0)
您应该阅读union
:
这将帮助您了解会发生什么 - 基本上union
的所有成员都存储在内存中的同一地址。
答案 5 :(得分:0)
让我们假设,原始int大小是32位。
C / C ++中联合数据类型的概念是:它使我们能够在同一个内存位置存储不同的数据类型。我们可以定义一个包含许多成员的联合,但是在任何给定时间只有一个成员可以包含一个值。联合的大小足以包含其中最大的成员。
在你的情况下:'a'和&amp; 'b'是int类型,因此'var'联合的大小是32位。
现在想象一下32个大小的二进制数组。让我们说A [32]。最少5个有效位存储01010,即分配给'v.a'的二进制形式10。接下来当你将20分配给'v.b'时,那么10100(20的二进制形式)将取代01010。所以目前联合v在其内存空间中有10100。
当您访问'v.a'时,它将返回该内存位置的当前值。
请参阅链接wikipedia link