在下面的代碼中,可以預測int的值(如何?),還是隻是垃圾?以下工會分配的值如何?
union a
{
int i;
char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
在下面的代碼中,可以預測int的值(如何?),還是隻是垃圾?以下工會分配的值如何?
union a
{
int i;
char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
我要說的是取決於int
和char
大小。 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時都可以被視爲零或空。
它恰巧是'union的兩個主要用途之一'。 (另一種是簡單的多態,這在C++中是無關緊要的。) – 2012-08-10 07:52:11
在C++中,使用'union'是無用的,因爲它可以被'reinterpret_cast'替代。雖然在C中確實有用。 – Morwenn 2012-08-10 07:55:20
結果也取決於處理器的字節順序。例如,在MIPS(其中char [0]將是最重要的字節)上編譯代碼時,會觀察到不同的結果,並且x86處理器(即little endian和char [0]將是最不重要的字節)。 – 2012-08-10 07:57:39
從技術上講,它是UB。 – 2012-08-10 07:33:45
可能的重複[將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
它的未定義行爲,但它可能仍然有效。 – askmish 2012-08-10 07:35:19