使用union变量分配两个值

时间:2013-08-19 04:07:23

标签: c unions

变量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。

6 个答案:

答案 0 :(得分:6)

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

如果你期望输出为10,你可能会考虑struct的行为。

在真正扭曲的场景中,可以将不同值的部分同时存储在并集中,但通常会将部分覆盖的值设置为损坏。例如,这个:

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

可以同时存储s.as.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.chdatum.n

答案 1 :(得分: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结构现在包含两个整数。

答案 2 :(得分:1)

一次加入你可以分配一个值。在联合中,值彼此重叠。所以你在为两个union元素赋值时做错了。它将始终显示最后指定的值。因此,如果您要访问a的值,它将显示上次更新的值。

答案 3 :(得分:0)

unionstruct的不同之处在于以下两种方式:

  • 为现有的最大类型分配空间(因为它们都是int,整体联合的大小为int
  • Only one value可以随时存储在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