2009-05-21 16 views
19

私がユニオンを持つ場合、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]) 
+6

標準は 'u.i&0xFF == uc [0]'とは言わないか、iの下位バイトはc [0](endianness)であることが保証されていないことに注意してください。 – Spudd86

答えて

23

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

あなたが尋ねる式の個々の比較は真ですが、ユニオンがアドレス0x0001にある場合を除いて、表現は全体として偽です。

が削除されたテキストは、以下の比較に適用:

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

改訂版は、明確なポインタ型を比較す​​る - ポインタが無効ポインタにキャストする必要があります。


私は標準を引用するように頼まれた - または標準のセクションを識別します。

C99 - セクション6.7.2.1構造と組合指定子(段落14):

組合オブジェクトへのポインタは、適切に変換され、そのメンバーの各々に点(又はメンバーがビットフィールドである場合、それが存在するユニットへ)、その逆も同様である。

+3

Canあなたは基準の関連部分を参考にしてください? –