2011-03-06 107 views
3

把這個代碼片段爲例:關於聯盟的未使用的字段

union stack { 
    int a; 
    float b; 
}; 

union stack overflow; 
overflow.a = 5; 

當我做了printf("%d",overflow.b);我得到GCC和渦輪零。 當我做了一個printf("%f",overflow.b);我得到零海灣合作委員會和垃圾渦輪。

你能解釋一下爲什麼會發生這種情況。 聯合中未使用的變量究竟發生了什麼?

另外,如果bint,printf("%d",overflow.b);給出了值5.爲什麼?

回答

6

在聯盟中,所有成員共享相同的內存。當您分配給.a時,您正在向存儲器寫入一個int值。當你訪問.b時,你正在解釋你剛寫入一個int的那些相同的字節,作爲一個浮點數。

當成員是不同的大小(如int和float可能),那麼一些字節將被改變,而另一些字節則不會被改變。查看較大的成員時,您可能正在訪問未初始化的內存。

有沒有「未使用變量」,在工會,只是普通內存的未使用的解釋。

當您將b設爲int時,您說.a應該將字節解釋爲int,並且.b也應該將字節解釋爲int。換句話說,將相同聯合的兩個成員聲明爲同一類型是沒有用的。

+0

這幾乎解釋了吧:) – n0nChun 2011-03-06 18:15:24

1

printf("%d",overflow.b);是UB(在printf的不正確的格式指定符)。

printf("%f",overflow.b);是UB(overflow.b尚未分配給)。兩個工會的成員都有相同的空間。兩者在內存中都有不同的表示(一個是int,另一個是float)。分配給一個,並試圖訪問第二絕對是UB

0

如果您已設置a的東西,的b部分將是,但b一部分可能是未初始化的數據,根據的sizeof int和float系統上。將其解釋爲浮動,誰知道會發生什麼?鼻惡魔。不要這樣做。