私は以下の構造を有すると仮定:パディングエリアをワイプすることが保証されている構造の初期化はゼロですか?
typedef struct
{
unsigned field1 :1;
unsigned field2 :1;
unsigned field3 :1;
} mytype;
最初の3ビットは使用できますが、sizeof(mytype)
はパディングの29ビットを意味する4
を返します。
mytype testfields = {0};
か:: 私の質問は、これらのパディングビットは、文で初期化され、ゼロであることを標準で保証されていることが前提に、次のmemcmp()
を実行しても安全です
mytype myfields = {1, 1, 1};
このようなことをそのビット4..29はゼロになるため、比較には影響しません。
if (memcmp(&myfields, &testfields, sizeof(myfields)) == 0)
printf("Fields have no bits set\n");
else
printf("Fields have bits set\n");
+1、興味深い私はこの変化を認識していませんでした。 – ouah
私はあなたがC11段落の先頭を追加する必要があると思います*自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不定です。静的またはスレッド記憶期間を持つオブジェクトが明示的に初期化されていない場合、*これは 'mytype testfields = {0};の埋め込みを保証するものではなく、' 0'に設定されます。 – ouah
@ouah、実際には抜け穴があるようですが、あなたは正しいです。私はそれが意図されているとは思わないので、もう少し説明します。いい視点ね。 –