配列の要素の初期化

もしかしたら 「配列を使ってプログラミングしていいのは小学生までだよね」 と言われそうな気もしています. でも, プログラミングの分野で自分はまだ小学生レベルにすぎないのだと思えば, まあそれはそれで納得なのですが.

ところで, C 言語で, 配列の各要素の値を 0 に初期化したいときはどうすればよいのか, よくわかっていませんでした. たとえば, こんな書き方をしてみたり,

    int data[5];
    for (i = 0; i < 5; i++)
        data[i] = 0;

こんな書き方をしてみたり,

    int data[5] = { 0, 0, 0, 0, 0 };

していました.

ところが, いま読んでいる本, Practical C Programming, Third Edition (Steve Oualline © 1997 O'Reilly Media, Inc. ISBN 978-1-565-92306-5) の Chapter 5 (p. 74) に, 次のようにさらりと書かれていました.

The number of elements in {} does not have to match the array size. If too many numbers are present, a warning will be issued. If an insufficient amount of numbers are present, C will initialize the extra elements to 0.

え, そうなの? と思いまして, 確認してみました.

int main(int argc, char *argv[]) {
    int i, data[20] = { 3, 1, 4, 1, 5, 9 };
    for (i = 0; i < 20; i++)
        printf(" %d", data[i]);
    printf("\n");
}

実行結果は次のとおり.

 3 1 4 1 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0

ありゃ, 本当ですね.

これならば, たとえば, 要素数 100 個の配列を宣言すると同時に, すべての要素の値を 0 に初期化するんであれば, 次のように書けば済むということですね.

    int data[100] = {};

知りませんでした.

そんなこと, 書いてあったかなあ, と思って, 前に読んだ K&R のページをぺらぺらとめくってみたら, ちゃんと書いてありました. たとえば, 付録 A (p. 273) には, 次のように書かれていました.

配列に対する初期値式は, そのメンバーに対する大カッコ付きの初期値式のリストである。 配列のサイズが知られていないときには, 初期値式の数で配列のサイズが決まり, その型が完全になる。 配列が固定したサイズをもつ場合には, 初期値式の数はその配列のメンバーの数を越えてはならない。 それが少ないときには, 残りのメンバーは 0 で初期化される。

たぶん, はじめてその箇所を読んだときには, わかったようなわからないような, いい加減な理解のまま読み流してしまったんだろうと思います. こんなことでは, 小学校どころか幼稚園に入園することもできないレベルですな...