<ポインタ配列の初期化とエラー処理>

 

 <例6−2>ではポインタ配列を宣言した後、すべての要素をNULLポインタで初期化しています。

 

char *table[N];

...

for (i=0; i<N; i++)

         table[i] = NULL;

 

 宣言しただけではtableの各要素には不定値、すなわち不定のアドレスを指すポインタが入っているので、それをNULLで初期化しているわけです。

 

 その後で、各ポインタ要素にmallocによって確保された領域を指すポインタを代入するので、NULLでの初期化は無駄に見えるかもしれません。

 

for (i=0; i<N; i++) {

         ...

         table[i]=(char *)malloc(sizeof(char)*(strlen(s)+1));

         ...

}

 

 確かに、すべてのmallocに成功すれば問題ありません。しかしforループの途中に、例えばtable[M]mallocで失敗した時(mallocからNULLが返された時)は、それまでに確保したtable[0]からtable[M-1]の領域を開放する、というエラー処理をしなくてはなりません。

 

 <例6−2>では、途中でmallocに失敗した場合には、すべてのポインタ配列要素に対してfreeを実行するパートにジャンプします。

 

FREE:

         for (i=0; i<N; i++)

                 free(table[i]);

 

 table[M]で失敗してここにジャンプしてきた時、table[M+1]以降に不定アドレスが入っているとまずいことになりかねません。free関数は引数にNULLを受け取った場合は何もしないことが保証されていますので、始めにすべてNULLで初期化しておいたわけです。

 

 

戻る