2013-08-19 105 views
1

变量a由值10赋值,变量b由联合变量v赋值20然后它给出的是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

不确定你在问什么;但[Google](https://www.google.com/search?q=c+union)有很多关于C联盟的信息 – 2013-08-19 04:11:18

+0

谢谢@JensGustedt。我删除了误导评论(你只应该阅读最近写的字段) – Himanshu

回答

4

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.b.ba分配给s.a单块,并暗示所有的s.b不再是值得信赖的。

通常用于存储不同类型的工会组织将被嵌入在一个结构,其第一成员记录的联合成员使用:

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

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

0

一个unionstruct区别这两种方式:

  • 将空间分配给当前最大的类型(因为他们俩都int,工会整体的小型化是int
  • Only one value可随时存储在union中。

您存储到v的最后一个值是20,所以应该打印union的任何成员时获得的值回。

如果您想要访问两个成员,那么您应该使用struct来代替。

+0

如果我想要值a = 10和b = 20,那么我可以使用联合..?我怎么可以使用联合来获得这些值,不管它是可能的还是我应该使用结构..? – Vaibhav

+0

**否。**如果您想要这种行为,请使用'struct'。 – Makoto

+0

@Vaibhav当你不知道它是什么或它是为了什么时,你为什么试图使用一个联合?为什么*不会使用结构? –

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

0

假设,原始的int大小是32位。

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

你的情况:'a'&'b'是int类型,所以'var'union的大小是32位。

现在想象大小为32的二进制数组。让我们说A [32]。至少5个有效位存储01010,即分配给'v.a'的10的二进制形式。接下来当你将20赋值给'v.b'时,10100(20的二进制形式)将替换为01010.因此,当前union v在内存空间中有10100个。

当您访问'v.a'时,它将返回该内存位置的当前值。

见链接wikipedia link

1

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