あなたの最も気になる質問に答えるために、「..それが機能する可能性はどのくらいですか?」、それが確かなことでない限り、可能性に賭けないでください. この場合ではありません。
標準 (§6.7.2.1,p15) では、構造体の最初のメンバー、または共用体のすべてのメンバーのアドレスは、構造体または共用体自体のアドレスと同じであると規定されています。あなたにとって、これは と のアドレスが同一であることを意味するだけでarray[16]
ありnamed
、両方とも のアドレスと同等ですstate
。ただし、実装依存のパッキングがなければ、構造体が正確にオーバーレイされるという保証はありません。これは、標準の同じセクションで、構造体間のパッキングが可能であると述べられているためです。
たとえば、何らかの理由で、常に 64 ビット境界でメンバーを開始するパッキング スキームを使用するコンパイラは、name
次のようにレイアウトできます。
struct {
uint32_t c0;
**padding 4 bytes**
uint32_t k0[4];
uint32_t c1;
**padding 4 bytes**
uint32_t v[2];
uint32_t i[2];
uint32_t c2;
**padding 4 bytes**
uint32_t k1[4];
uint32_t c3;
**padding 4 bytes**
} name;
つまり、保証されているのname
は、全体として占有されているメモリと、ユニオンの他のメンバーが占有しているメモリがarray[16]
、それぞれのアドレス指定可能な場所の先頭から同じメモリを占有することだけです。のパッキングのカバーの下でそのメモリがどのように見えるかはname
、実装と、提供したいパッキングのヒント次第です。
標準の関連部分の一部:
C99-§6.7.2.1,p6
6.2.5 で説明したように、構造体はメンバーのシーケンスから構成される型であり、その記憶域は順序付けられたシーケンスで割り当てられ、共用体は、記憶域がメンバーのシーケンスから構成される型です。重なります。
C99-§6.7.2.1,p15
構造体オブジェクト内で、非ビット フィールド メンバーとビット フィールドが存在するユニットには、宣言された順序で増加するアドレスがあります。適切に変換された構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。構造体オブジェクト内に名前のないパディングがある場合がありますが、先頭にはありません。
C99-§6.7.2.1,p16
共用体のサイズは、最大のメンバーを含めるのに十分です。いつでも最大 1 つのメンバーの値をユニオン オブジェクトに格納できます。適切に変換された共用体オブジェクトへのポインターは、そのメンバーのそれぞれ (またはメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。
C99-§6.7.2.1,p17
構造体または共用体の末尾に名前のないパディングがある場合があります。