1

变量 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 作为输出。

4

6 回答 6

6

union将所有列出的成员重叠在一起(尽管有些成员可能比重叠的初始部分延伸得更远),因此分配给其中一个.a.b正在写入内存的同一部分。考虑到这一点,输出应该是有意义的。

struct如果您期望输出为 10,您可能正在考虑' 的行为。

在真正扭曲的场景中,可能会将不同值的一部分同时存储在一个联合中,但通常会假定部分覆盖的值已损坏。例如,这个:

union {
    char a;
    struct { char ba; char bb; } b;
} s;

可以同时存储s.as.b.bb,但由于s.a重叠s.b.ba,分配给s.astomps s.b.ba,并且暗示 all ofs.b不再可信。

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

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

在这里,type可能会包含一个枚举值来指示是否datum.chdatum.n正在使用原子。

于 2013-08-19T04:12:22.137 回答
2

一次在联合中,您可以分配一个值。在联合中,这些值相互重叠。所以你在为联合的两个元素赋值时做错了。它将始终显示最后分配的值。因此,如果您正在访问 a 的值,它将显示最后更新的值。

于 2013-12-05T11:24:34.930 回答
1

这是一个有启发性的问题。尝试反转分配,如:

   v.b=20;
   v.a=10;

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

#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 结构现在包含两个整数。

于 2013-08-19T05:44:00.367 回答
0

A在以下两个方面union与 a不同:struct

  • 为存在的最大类型分配空间(因为它们都是int,所以联合的整体大小为int
  • union任何时候都只能存储一个值。

您存储到的最后一个值v20,因此在打印union.

如果您想同时访问这两个成员,那么您需要使用 astruct来代替。

于 2013-08-19T04:11:00.483 回答
0

你应该阅读union

这将帮助您了解发生了什么 - 基本上 a 的所有成员union都存储在内存中的相同地址。

于 2013-08-19T04:12:02.303 回答
0

让我们假设,原始 int 大小是 32 位。

C/C++中联合数据类型的概念是:它使我们能够将不同的数据类型存储在同一个内存位置。我们可以定义一个包含许多成员的联合,但在任何给定时间只有一个成员可以包含一个值。工会的规模足以容纳其最大的成员。

在您的情况下:“a”和“b”都是 int 类型,因此“var”联合的大小是 32 位。

现在想象一下大小为 32 的二进制数组。让我们说它A [32]。最低 5 个有效位存储 01010,即分配给“va”的 10 的二进制形式。接下来,当您将 20 分配给“vb”时,10100(20 的二进制形式)将替换 01010。所以目前联合 v 的内存空间中有 10100。

当您访问“va”时,它会返回该内存位置的当前值。

查看链接维基百科链接

于 2013-08-19T05:48:33.223 回答