次のコードでは、int の値を予測できますか (どのように?)、それともただのゴミですか?
union a
{
int i;
char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
int
それはとのサイズに依存すると思いますchar
。Aunion
には、最大の変数のメモリが含まれています。int
が4バイトで、char[2]
2バイトを表す場合、-arrayint
よりも多くのメモリを消費するため、すべての-variablesを設定して完全な-memoryを0にchar
初期化することはありません。これはメモリの初期化メカニズムによって異なりますが、基本的に、余分な2バイトが不特定の値で埋められるため、の値はランダムに見えます。int
char
int
その上、aのある変数を埋めてunion
別の変数を読み取ることは、まさに私の意見で組合を危険にさらすものです。
それが最大のデータ型であることが確実な場合は、次のように記述int
して全体を初期化できます。union
union a
{
int i;
char ch[2];
};
void foo()
{
a u = { 0 }; // Initializes the first field in the union
cout << u.i;
}
したがって、最大のタイプをユニオンの先頭に配置することをお勧めします。ただし、すべてのビットが0に設定されている場合、すべてのデータ型がゼロまたは空と見なされる可能性があることを保証するものではありません。