11

一般に、C標準に従って、0のmemset()がC構造体のパディングビットをゼロにすることが保証されていますか?

gccはどうですか?

たとえば、次のようになります。

struct MyStruct
{
    unsigned char   member1;
    unsigned int    member2;
    char        member3;
    unsigned char   member4;
    float       member5;    
};

struct MyStruct ms;

memset(&ms, 0, sizeof( struct MyStruct));
4

3 に答える 3

15

おそらくmemset、構造体(または配列、プリミティブ、またはメモリのチャンク)について何も知らないので、パディングビットをそのままにしておきたい場合でも、それはわかりません。彼らがどこにいるかさえ知っています。

于 2011-12-18T04:33:23.403 に答える
11

はい、memset指定されたアドレスから始まる指定された長さのメモリの連続領域に32ビット値を書き込みます。あなたの場合、memsetは(32ビット値)で領域を書き込みます0

したがって、memset長さsizeof (your_struct)のある場合は、問題ないはずです。

memset(&ms, 0, sizeof(struct MyStruct));
于 2011-12-18T04:27:49.587 に答える
8

重要な場合は、安全ではなく、移植性のないことをしている可能性があります。

はい、呼び出しはすべてのパディングビット(またはバイト)を0に設定しますが、オブジェクトをall-bits-zeroに設定すると0.0に設定されるmemsetという保証はありません。float同じことがポインタにも当てはまります。all-bits-zeroがnullポインタであるとは限りません。(どちらの場合も、ほとんどの実装に当てはまります。)

元のISOC90またはC99標準は、all-bits-zeroが整数型の0の有効な表現であることを保証していませんでした。C99以降の技術正誤表の1つに、このような保証が追加されました(整数型のみ)。

移植性のために、何かをゼロにしたい場合は、それを明示的に設定します。静的オブジェクトおよび初期化子の省略されたメンバーのゼロ値初期化を利用することもできます。

用語の落とし穴:「パディングビット」は整数型の表現の一部です(通常、それらはありません)。構造体メンバー間のパディングはバイトのパディングです。

于 2011-12-18T05:31:37.140 に答える