3

これに従ってhttps://stackoverflow.com/a/1812932/1814023 writing one member of union and reading another member is undefined behavior.

そして、これに従ってhttps://stackoverflow.com/a/11640603/1814023 type punning is allowed in C99 / C11

この 2 つの投稿で少し混乱していますが、どちらが正しいですか? 型のパニングと共用体のメンバーへのアクセスを理解するのに助けが必要です。

ありがとう。

4

1 に答える 1

6

これは、C89 で実装定義されています。

C89 3.3.2.3 構造体と共用体のメンバー

1 つの例外を除いて、値がオブジェクトの別のメンバーに格納された後にオブジェクトのメンバーがアクセスされる場合、動作は実装定義です。union共用体の使用を簡素化するために、1 つの特別な保証が行われunionます。共通の初期シーケンスを共有する複数の構造体が a に含まれており、unionオブジェクトに現在これらの構造体の 1 つが含まれている場合、それらの共通の初期部分を検査することが許可されます。 . 対応するメンバーが 1 つ以上の初期メンバーのシーケンスに対して互換性のある型を持っている場合、2 つの構造体は共通の初期シーケンスを共有します。

C99/C11 では許容されますが、トラップ表現の場合、値は不定です。

C11 6.5.2.3 構造体と共用体のメンバーの脚注

オブジェクトの内容を読み取るために使用されunionたメンバーが、オブジェクトに値を格納するために最後に使用されたメンバーと同じでない場合、値のオブジェクト表現の適切な部分が、説明されている新しい型のオブジェクト表現として再解釈されます。 6.2.6 (「型パニング」と呼ばれることもあるプロセス)。これはトラップ表現である可能性があります。

于 2013-10-22T07:40:27.560 に答える