多次元配列の初期化
かなり前からアクセスログを見て気付いてはいたのですが、当サイトの記事が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 から "-nospam" を削除してトラックバックを送信してください。

