8

次のようにユニオンで 2 つの配列を共有することは可能ですか?

struct
    {
        union
        {
            float m_V[Height * Length];
            float m_M[Height] [Length];
        } m_U;
    };

これら 2 つの配列は同じメモリ サイズを共有していますか、それともどちらかが長いですか?

4

2 に答える 2

3

両方のアレイは、同じサイズとレイアウトである必要があります。もちろん、を使用して何かを初期化するm_Vと、へのすべてのアクセスm_Mは未定義の動作になります。たとえば、コンパイラは、で要素を変更した場合でも、の何も m_V変更されていないことに気づき、以前の値を返す場合がありますm_M。遠い昔、私は実際にそうするコンパイラを使ったことがあります。同じ関数への参照とへの 参照を渡すなど、ユニオンが表示されない場所へのアクセスは避けます。m_Vm_M

于 2012-07-09T11:20:56.770 に答える
1

これらがメモリ内で同じサイズになることが暗黙的に保証されます。コンパイラは、2D 配列または 1D 配列のどこにもパディングを挿入できませんsizeof

[もちろん、m_V読み書きを行った場合m_M(またはその逆の場合) は、まだ型をしゃれていることになり、技術的には未定義の動作を引き起こします。しかし、それは別の問題です。]

于 2012-07-09T11:10:40.677 に答える