2017-11-21 12 views
1

私は作成したユニオンのサイズを見るために単純なコードを試しています。サイズは52で、サイズは52と言います。同じサイズの別の文字列を試してみました。余分な2バイトはどこから来ますか?sizeof unionは、常にその中の最大のデータ型のサイズですか?

ここコード

union Name 
{ 
    int y; 
    float x; 
    char name[50]; 
}name; 

int main(int argv, char *argc[]) 
{ 
char name2[50]; 
printf("%d",sizeof(name)); 
printf("\n%d",sizeof(name2)); 
return 0; 
} 

結果は52と50

+0

は 'sizeof'の値'のための "%d" を '使用しないでください。 ''%zu ''を使用してください。 –

+0

ユニオンのサイズは、その最も大きいアライメント制限メンバーの*アライメント*に丸められます*。 –

+0

@TomKarzes通常、実際には真ですが、標準では上限はありません。おそらく、実装特有の拡張があり、切り上げは行われません –

答えて

2

アラインメントです。これらの共用体の配列を作成しようとして、sizeofが50しかない場合、xyのメンバーは効率的に整列されません。整列の制約を満たすために、サイズは4の倍数にパディングされます。

1
説明はに要約することができる

-

組合型のオブジェクトのサイズは、 に必要なストレージの量は、その種類、の最大成分プラス任意のパディング を表しであります最後ににアライメント の境界までを上げる必要があります。

1

必然的に52です。余分な2バイトはデータを格納しません。それはパディングスペースです。

あなたはdouble yからfloat yを変更する場合は、あなたも56の:)

一部のデータ・タイプはどんな理由のための位置合わせが必要に表示されます。あなたの場合、float yは4バイトに整列する必要があります。ユニオンのサイズが50だけで、name n[2]を作成すると、n[1].yの整列がうまくいきません。したがって、アライメントの問題では、ユニオンのサイズは最大52(4 * 13)です。

3

パーISO 9899:201X(C11)のドラフトは、(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

S6.7.2.1

段落16:労働組合の大きさは最大が含まれているのに十分ですそのメンバー。 [...]

パラグラフ17:構造体または共用体の最後に無名のパディングがある可能性があります。

[編集:@のM.Mでコメントごとに、より多くの最近のドラフトを使用する]

関連する問題