e105.c

配列の初期化要素過多

#ident	"$Id: e105.c.html 187 2006-05-17 05:23:14Z ono.mki $"
/*###7 [cc] 警告: AAA:e105: 標準Cでは配列の初期化要素過多です 【 XXX 】%%%*/

int     main()
{
        static  int array[2] = { 1, 2, 3, };

        return(0) ;
}

解説 見ての通り, 配列を初期化する時に要素数が多すぎます。 ご存知ない方のために捕捉して説明します。 配列を宣言する時に初期化子(initializer)を付ける場合はその要素数を 省略することができます。 要素数はコンパイラが自動的に計算してくれます。 例: static int array1[] = { 1, 2, 3, }; <-- 要素数は「3」となる。 2次元以上の配列の場合は1番左の[]の要素数を省略することができます。 例: static int array2[][2] = { <-- 1番左の[]の要素数は「3」となる。 { 1, 2, }, { 3, 4, }, { 5, 6, } }; よって,初期化子を付ける場合は要素数を省略するべきです。 でも,そうすると for 文でループするときにどこまでループしたらいいか わからないじゃないかと言う声が聞こえてきます。 これには次のようなマクロを用意して対処します。 #define ARRAYsize(a) (sizeof(a) / sizeof(a[0])) for (i = 0; i < ARRAYsize(array1); i++) { ・ ・ ・ } sizeof演算子に配列そのものを渡すとその配列全体の大きさが求められます。 それを配列の「0」番目の要素の大きさで割れば,配列の要素数となります。 この方法を使えば初期化時の要素数を増やす場合,ただ再コンパイルすれば 自動的にループMAX値が変更されるので修正箇所が1箇所ですみます。