閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

配列や構造体の初期化

配列や構造体は、以下の構文で初期化することができます。

int arr[10] = {1,2,3};

この時、配列の 0〜2 番目の要素は順に 1,2,3 で初期化されます。では、それ以降の 3〜9 番目の要素はどうなるのかというと、強制的に 0 で初期化されます。これを利用すると、memsetやZeroMemoryを使用せずとも配列や構造体の各要素を 0 で初期化することができます。

// 配列を0で初期化
int arr[10] = {0};
// 構造体のメンバを0で初期化
struct hoge {
    int a, b, c;
    double d, e, f;
} st = {};

といった感じ。しかし、BCCでは配列を初期化するときの括弧({})を空にするとコンパイルエラーになってしまったので、int arr[10] = {0};とひとつだけは要素を指定してやらないといけないようです(構造体の方はいらない)。

なお、この初期化の仕方は左辺値の型がPOD型の時のみ有効になります。それ以外はコンパイルエラーになるはず。非POD型にmemset関数を適用するのもご法度なので、そういう型を扱う場合は適切なコンストラクタを定義しましょう。

なんか意外と知られていないようなので書いてみました。