0

次のコードでは、int の値を予測できますか (どのように?)、それともただのゴミですか?

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

1 に答える 1

3

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に設定されている場合、すべてのデータ型がゼロまたは空と見なされる可能性があることを保証するものではありません。

于 2012-08-10T07:49:16.643 に答える