4

私は次のような構造体を持っています

typedef struct
{
    int a;  // Let's say this ends up being 4 bytes
    int b;  // 4 bytes
    char text[10]; // 10 bytes
} blah_t;

static blah_t myvar;
  1. フィールドのサイズの合計が では 18 バイトですがblah_tsizeof(blah_t)パディングのために 20 バイトであるとします。
  2. myvar静的であるため、ゼロ初期化されます。

質問:

  1. 静的変数のパディング バイト 19 と 20 は 0 であることが保証されていますか? そうでない場合は、静的変数であっても、構造体のmemset(&myvar, 0, sizeof(blah_t))いずれかが有効になるようにする必要があります。memcmp
  2. どうcalloc(1, sizeof(blah_t))ですか?バイト 19 と 20 はゼロであることが保証されていますか? 私はこれが事実だと信じています。
4

3 に答える 3

5

ISO C99 標準より: 「メンバー オブジェクトを含め、構造体型または共用体型のオブジェクトに値が格納される場合、パディング バイトに対応するオブジェクト表現のバイトは、指定されていない値を取ります。」

さらに見てみると、これはいくつかの追加の問題を議論しているように見えます: C と C++ の構造の比較

編集:この質問自体の複製ではありませんが、詳細な回答に関する多くの一般的な問題。

于 2013-03-13T00:05:10.080 に答える
0

パディング バイト 19 と 20。これらは静的変数に対して 0 であることが保証されていますか?

Randy Howard の回答を参照してください。

calloc(1, sizeof(blah_t) ) はどうですか? バイト 19/20 はゼロであることが保証されていますか?

はい。calloc はメモリをゼロにします。

好奇心から、なぜパディングを気にするのだろうと思っています。移植性のあるコードは、表現 (パディング、エンディアンなど) のあらゆる側面を気にする必要はありません。

于 2013-03-13T00:32:33.633 に答える