2012-08-10 15 views
0

在下面的代碼中,可以預測int的值(如何?),還是隻是垃圾?以下工會分配的值如何?

union a 
{ 
    int i; 
    char ch[2]; 
}; 
a u; 
u.ch[0] = 0; 
u.ch[1] = 0; 
cout<<u.i; 
} 
+2

從技術上講,它是UB。 – 2012-08-10 07:33:45

+0

可能的重複[將int的所有字節設置爲(無符號字符)0,保證代表零?](http://stackoverflow.com/questions/11138188/set-all-bytes-of-int-to- unsigned- char0-guaranteed-to-represent-zero) – 2012-08-10 07:34:58

+1

它的未定義行爲,但它可能仍然有效。 – askmish 2012-08-10 07:35:19

回答

3

我要說的是取決於intchar大小。 A union包含最大變量的內存。如果int是4個字節,並且char[2]代表2個字節,則int消耗的內存比char-數組更多,因此您不是通過設置全部char-變量來將整個int-內存初始化爲0。這取決於你的內存初始化機制,但基本上,int的值看起來是隨機的,因爲額外的2個字節填充了未指定的值。

此外,填寫union的一個變量並閱讀另一個變量正是我認爲工會不安全的原因。

如果您確信int是最大的數據類型,你可以通過編寫

union a 
{ 
    int i; 
    char ch[2]; 
}; 

void foo() 
{ 
    a u = { 0 }; // Initializes the first field in the union 
    cout << u.i; 
} 

因此它可能是一個好主意,把最大的類型在工會的開始初始化整個union。儘管如此,並不是所有數據類型在所有位設置爲0時都可以被視爲零或空。

+0

它恰巧是'union的兩個主要用途之一'。 (另一種是簡單的多態,這在C++中是無關緊要的。) – 2012-08-10 07:52:11

+0

在C++中,使用'union'是無用的,因爲它可以被'reinterpret_cast'替代。雖然在C中確實有用。 – Morwenn 2012-08-10 07:55:20

+0

結果也取決於處理器的字節順序。例如,在MIPS(其中char [0]將是最重要的字節)上編譯代碼時,會觀察到不同的結果,並且x86處理器(即little endian和char [0]將是最不重要的字節)。 – 2012-08-10 07:57:39