次のコードでは、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バイトが不特定の値で埋められるため、の値はランダムに見えます。intcharint
その上、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に設定されている場合、すべてのデータ型がゼロまたは空と見なされる可能性があることを保証するものではありません。