<ポインタ配列の初期化とエラー処理>
<例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で初期化しておいたわけです。