Open2

C の構造体のゼロ初期化

KusaReMKNKusaReMKN

C で構造体を 0 で埋めたい。どうする。

  1. 宣言時に初期化する。
    不足分の要素は 0 や 0.0 や NULL で初期化される。
struct foo hoge = { 0 };
  1. memset(3) で初期化する。
    全てのバイトが 0 で初期化される。
struct foo hoge;
memset(&hoge, 0, sizeof(hoge));
KusaReMKNKusaReMKN

私は宣言時に初期化するべきだと考えている。
理由は次の通り:

  1. memset(3) を利用すると、不定(不正)な値が書き込まれるかもしれない。
    たとえば、double や float の 0.0 は全てのビットが 0 である訳ではない。
    全てのビットが 0 である値は不正な値かもしれない (私は浮動小数点数の仕様を詳しく知らない)。
    さらにポインタにおいても同様で、全てのビットが 0 であるポインタが NULL であるとは限らない。
    処理系によっては NULL != 0 である場合がある。

  2. memset(3) を利用すると、愚直な処理系では関数呼び出しのオーバヘッドがある。
    実行速度は日々向上しているので気にするほどの問題ではないかもしれない。