e405.c

初期化されていない配列(2)


コード例: int aiNG[10] ; printf("aiNG[5]=%d¥n", aiNG[5]) ; /* 結果は不定 */
修正コード: /* こうするだけで残りの部分は0で初期化されます */ int aiOK[10] = {1,2,3,4,5,} ; printf("ai[5]=%d¥n", aiOK[5]) ; /* 結果は必ず 0 */
解説 初期化されていない配列の要素値を参照しています。 e404は配列の添字が変数でしたが、e405は添字が定数です。 配列の初期化と言われると、 memsetやループで回すことを考える人が少なからずおりますが、 たったこれだけの処理で配列の初期化ができます。 必ず初期化を行いましょう。
参考 サンプルソース /* 配列が初期化されている様子を */ /* 実際に確かめてください */
#include <stdio.h> #define MAX 10 int main(void) { int i=0; int aiNG[MAX] ; /* 初期化されていない */ int aiOK[MAX] = {0} ; /* 全て0で初期化 */ int aiOK2[MAX] = {0,1,2,3,4,} ; /* 残りの部分は0で初期化されます */ double adNG[MAX]; /* double時の場合 */ double adOK[MAX] = {0,} ; /* doubleでも0初期化 */ /* int */ for (i=0; i< MAX ; i++) printf("aiNG[%d]=%d ", i, aiNG[i]) ; puts("") ; for (i=0; i< MAX ; i++) printf("aiOK[%d]=%d ", i, aiOK[i]) ; puts("") ; for (i=0; i< MAX ; i++) printf("aiOK2[%d]=%d ", i, aiOK2[i]) ; puts("¥n") ; /* double */ for (i=0; i< MAX ; i++) printf("adNG[%d]=%f ", i, adNG[i]) ; puts("") ; for (i=0; i< MAX ; i++) printf("adOK[%d]=%f ", i, adOK[i]) ; return 0; }