1

unionLinux環境でCを理解して使用しようとしています。私が次の組合を持っているとしましょう

union test {
    int one;
    long two;
} t1;

t1.oneネットワークファイル記述子(ソケットfd)に書き込む場合、ユニオンが最大の要素である2つを選択すると、余分なゼロがfdに書き込まれます。構造の結合によってさらに悪化する可能性があります。誰かがこれを克服する方法を教えてもらえますか?

4

3 に答える 3

1

Anは、構造のようではなくunion、最大の要素(この場合)のサイズを持っています。long変更oneすると、longの最初の32ビット(32ビットOS 16の場合)が上書きされます。変更twoすると、スペース全体が上書きされoneて失われます。

union test64ビットOSの場合:

-      64 bit      +
│    union test    │
├──────────────────┤
│ long             │
├─────────┬────────┘
│ int     |
└─────────┘

struct test64ビットOSの場合:

-           96 bit           +
│         struct test        │
├──────────────────┬─────────┤
│ long             │ int     │
└──────────────────┴─────────┘
于 2012-07-09T19:22:52.810 に答える
1

test.oneをネットワークfdに書き込む場合、余分なゼロがfdに書き込まれます。

余分なバイトが書き込まれることは正しいですが、これらのバイトの内容は必ずしもすべてゼロになるとは限りません。未定義です。一般に、他のフィールドを介して一部のデータを書き込んだ領域を超えているユニオンに属するバイトを読み取ることは、未定義の動作です。書き込まれるデータの量を制御する場合は、書き出す特定のタイプを指定する必要があります。

于 2012-07-09T18:50:00.127 に答える
1

いいえ、test.oneネットワークfdに書き込む場合は、正確にsizeof (int)バイトを書き込みます。 オブジェクトですtest.oneint組合全体にアクセスしない限り、それがたまたま組合のメンバーであるという事実は関係ありません。

ユニオン全体を作成する場合は、もちろん、ユニオンのフルサイズを作成します。これは、少なくとも最大メンバーのサイズになります。

だからそうしないでください。

ユニオンのどのメンバーが現在であるか(つまり、最後に値を割り当てたメンバー)を追跡し、そのメンバーだけを使用します。

繰り返しになりますが、あなたが私たちに提供した最小限の情報を考えると、ユニオンを使用することがまったく意味があるかどうかは明らかではありません。

于 2012-07-09T18:59:10.560 に答える