2017-11-23 6 views
-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

+2

何を印刷しますか? –

+2

1バイトの大きさなので、私は推測します;) – Jerfov2

+0

私は*驚いています* 1です。UBでなければなりません。ちょうどあなたのプラットフォーム上のsizeof(int)は何ですか? – Bathsheba

答えて

4

sizeof(s)undefinedです。構造内に他の名前のメンバーがないためです。

C11 6.7.2.1(P8):

構造体、又は組合指定子における構造体宣言リストの存在は新しいタイプ、翻訳単位内 を宣言する。構造体宣言リストは、構造体または共用体のメンバーの の宣言のシーケンスです。 struct-declaration-listに、名前付きの メンバーが含まれておらず、匿名構造体も匿名構造体もない場合、動作は定義されていません。 タイプは、リストを終了する}の直後までは不完全であり、その後は を完了します。

あなたはこのように記述する場合:だから

struct st{ 
     int : 1; 
     int i : 5; 
    }; 

構造でも名前のビットフィールドメンバがあるため、sizeof(s)はokです。

+0

sizeof(st)はstruct宣言のUBになります。 –

+0

UBであっても、あなたのコンパイラが堂々としているのは、何かが仕様に含まれていないので、コンパイラは何か悪いことをする必要はありません... –

+3

@GradyPlayer '悪い "または"良い "?それは実際には標準に従ったUBです。 –

関連する問題