24

共用体がある場合、C 標準では、共用体自体が最大要素のサイズに揃えられることが保証されます。

union U {
    long l;
    int i;
    short s;
    char c[2];
} u;

しかし、ユニオン内の個々のユニオン要素の整列については何を言っているのでしょうか? 次の式は真であることが保証されていますか?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])
4

1 に答える 1

33

各要素の開始は、共用体自体のアドレスに揃えられます。

あなたが尋ねる式の個々の比較は真ですが、ユニオンがアドレス0x0001にない限り、式全体は偽です。

削除されたテキストは、次の比較に適用されます:

&u.l == &u.i == &u.s == &u.c[0]

改訂版では、異なるポインター型を比較しています。ポインターは void ポインターにキャストする必要があります。


標準を引用するか、標準のセクションを特定するように依頼されました。

C99 - セクション 6.7.2.1 構造体と共用体の指定子 (段落 14):

適切に変換された共用体オブジェクトへのポインターは、その各メンバー (またはメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。

于 2009-05-21T05:16:10.470 に答える