3

一部の本ではイエスと言っていますが、次のコードはそうではないことを示しています

union
{
     int n;
     char array[5];
} u;
printf("%d %d %d", sizeof(u.n), sizeof(u.array), sizeof(u));

あなたの意見は何ですか?

4

5 に答える 5

3

共用体のサイズは、次の 2 つの要件を満たす必要があります。

  • 少なくともその最大のメンバーと同じ大きさである必要があります
  • これは、各メンバーの整列要件の倍数でなければなりません。

後者の規則は、配列が機能するために必要です。メモリに次々に配置された場合、共用体を適切に整列させます。

したがって、最大の要素が 5 バイトであるが、一部の要素が 4 バイトのアラインメントを必要とする場合、共用体のサイズは 5 バイト以上の 4 バイトの倍数でなければなりません。8 バイトでこれを満たします。

ほとんどの C 実装では、これら 2 つの規則に従う最小サイズを使用します。

于 2013-09-12T13:35:18.740 に答える
1

コンパイラは通常、アライメント要件に基づいてサイズを決定します。あなたの場合、最大のメンバーのサイズは5で、整列すると8になります。これは、このユニオン型の配列を宣言する可能性があるため必要です。

于 2013-09-12T08:01:52.373 に答える