2013-08-19 120 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

工會在同一時間,你可以分配一個值。在聯合中,這些值彼此重疊。所以你在爲兩個聯合元素賦值時做錯了。它將始終顯示最後分配的值。所以如果你正在訪問一個值,它會顯示最後更新的值。