1

「共用体は、一度に 1 つの非静的データ メンバーのみを保持できる特別なクラス タイプです」と言われています。( http://en.cppreference.com/w/cpp/language/union )

しかし、どうすれば複数のメンバーを保持できるのでしょうか?

yは 8 バイトでx、4 バイトです。union のサイズは、MAX 要素のサイズ (8 バイト) です。4 + 8 = 12バイトを保持できません...

よくわかりません。

#include <stdio.h>
#include <stdlib.h>

union number {
    int x;
    double y;
};

int main()
{
    union number value;

    // ok
    value.x = 1;
    printf("\n   int: %5d\ndouble:    %f\n", value.x, value.y);

    // ok
    value.y = 1.0;
    printf("\n   int: %5d\ndouble:   %f\n", value.x, value.y);

    // NOT OK! But if I swap `value.x and value.y` it will work properly...
    value.y = 1.0;
    value.x = 1;
    printf("\n   int: %5d\ndouble:     %f\n", value.x, value.y);


    return 0;
}

出力は出力

4

2 に答える 2

2

共用体は、「最大」のデータ型に十分なメモリを割り当てます。

例として、union に uint8_t a、uint16_t b が含まれる場合。データは次のように整列します

Bits LSB   0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15   MSB
Uint8_t  a -------------->
Uint16_t b ------------------------------------>
Var b=     0 0 0 0 0 0 0 1 1 1 1  1  1  1  1  1 in binary

そして、var aを見ると。2 進数では 00000001、10 進数では 128 になります。ええと、私があなたをさらに混乱させたかどうかはわかりません:)。

于 2013-07-26T14:17:46.100 に答える
1

ユニオンには必要な数のメンバーを含めることができますが、一度に有効なメンバーは 1 つだけです。これは、ユニオンのすべてのメンバーが同じメモリを共有するためです。したがって、1 人のメンバーを変更すると、他のメンバーも変更されます。ただし、メモリ内のレイアウトが異なることが多いため、あるメンバーに割り当ててから別のメンバーにアクセスすると、期待した結果が得られない場合があります。これは と の場合でintdouble一方を他方として使用することはできません。

あなたが探しているのは構造です:

struct number
{
    int x;
    double y;
};

上記には 2 つの別個のメンバーが含まれており、同じメモリを共有しなくなるため、両方を同時に使用できます。

于 2013-07-26T14:02:22.607 に答える