多次元配列の初期化

かなり前からアクセスログを見て気付いてはいたのですが、当サイトの記事がmuneda's diary取り上げられているようなので、一応反応しておくことにします。概要としては、一次元配列であれば、[迷信] とりあえず memset で初期化でご紹介したように、

int a[10] = {0};

でよいが、多次元配列ではそうはいかないということのようです。そして、代わりに、

int a[10][10] = { [0 ... 9] = { [ 0 ... 9] = 0 } };

のような初期化子を紹介されています。

結論からいうと、これは正しくありません。「正しくない」というと語弊があるかもしれませんが、少なくとも移植性のある記法ではありません。C99 では、

int a[10] = { [3] = 123 };

のように、集成体の初期化子に「要素指示子」を使用できるようになりました。しかし、[0 ... 9]のように、要素指示子で範囲指定できるのはあくまでも GCC 拡張です。そして、配列をゼロクリアするという当初の目的について考えた場合、多次元配列であっても、

int a[10][10] = {0};

とすることが可能です。

ちなみに、集成体以外でも同じように記述することができます。例えば、

int a = {0};

のようにです。使う機会は限られていますが、仕様上、配列なのか、構造体なのか、整数型なのかはっきりしない型の場合に効果を発揮します。例えば、mbstate_t 型をゼロクリアしたい場合には、

mbstate_t state = {0};

としておけば、実際の型にかかわらず、確実にゼロクリアすることができます。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/235
このエントリーを含むはてなブックマーク