次のプログラムでは、名前のないビットフィールドメンバーが構造体に宣言されています。プログラムの印刷の上サイズの指定されていないビットフィールドメンバ構造のサイズはなぜ1ですか?
#include <stdio.h>
struct st{
int : 1;
};
int main()
{
struct st s;
printf("%zu\n",sizeof(s)); // print 1
}
出力1
なぜsizeof(s)
印刷1
?
次のプログラムでは、名前のないビットフィールドメンバーが構造体に宣言されています。プログラムの印刷の上サイズの指定されていないビットフィールドメンバ構造のサイズはなぜ1ですか?
#include <stdio.h>
struct st{
int : 1;
};
int main()
{
struct st s;
printf("%zu\n",sizeof(s)); // print 1
}
出力1
なぜsizeof(s)
印刷1
?
sizeof(s)
はundefinedです。構造内に他の名前のメンバーがないためです。
C11 6.7.2.1(P8):
構造体、又は組合指定子における構造体宣言リストの存在は新しいタイプ、翻訳単位内 を宣言する。構造体宣言リストは、構造体または共用体のメンバーの の宣言のシーケンスです。 struct-declaration-listに、名前付きの メンバーが含まれておらず、匿名構造体も匿名構造体もない場合、動作は定義されていません。 タイプは、リストを終了する}の直後までは不完全であり、その後は を完了します。
あなたはこのように記述する場合:だから
struct st{
int : 1;
int i : 5;
};
構造でも名前のビットフィールドメンバがあるため、sizeof(s)
はokです。
sizeof(st)はstruct宣言のUBになります。 –
UBであっても、あなたのコンパイラが堂々としているのは、何かが仕様に含まれていないので、コンパイラは何か悪いことをする必要はありません... –
@GradyPlayer '悪い "または"良い "?それは実際には標準に従ったUBです。 –
何を印刷しますか? –
1バイトの大きさなので、私は推測します;) – Jerfov2
私は*驚いています* 1です。UBでなければなりません。ちょうどあなたのプラットフォーム上のsizeof(int)は何ですか? – Bathsheba