2010-11-20 88 views
0

任何人都可以請解釋我爲什麼下面的代碼打印20而不是10?以下代碼的輸出.. Union

感謝

#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; 
} 
+2

您在發佈之前是否閱讀過'union'的定義? – ruslik 2010-11-20 15:43:50

回答

3

通過工會的定義是:你不能同時使用v.av.b,因爲這兩個領域共享同一個地址。引用標準:

甲聯合類型描述重疊 非空集合構件的對象,其中每個 具有任選指定 名和可能的不同類型。

在這裏,只要您分配到v.b,就會覆蓋v.a。在你的情況下,因爲兩個變量都具有相同的類型,所以事情不會變得很難看,但是想象一下,如果a是一個字符例如floatb

如果你的目標是讓var是包含兩種不同int複合變量,那麼你應該使用struct,不union

0

聯合將足夠寬以存儲其包含的最寬類型,並且類型將共享相同的地址。如果你想ab不同,請使用struct

C99標準,部分6.7.2.1:

工會的大小是蘇夫網絡cient包含最大的成員。在 的值中,大多數成員可以隨時存儲在聯合對象中。一個指向 聯合對象的指針,經過適當轉換後,指向其每個成員(或者如果成員是位域,則指向其所在的單位),反之亦然。

從6.5.8章節:

全部指向同一個工會對象的成員比較平等的。

0

聯合是一種可以使用不同類型的modifires訪問相同的內存的東西。所以在你的代碼中,第一個分配沒有多少意義,因爲第二個分配存在。它以最後一個順序影響內存,所以你得到最後的分配值。