NULLと0と'\0'
スポンサーリンク
文字列の終端にNULLを入れる間違いが多くある。
array[len]=NULL;
これは環境によって動くが間違いである。
文字列は「ナル文字」で終わるのであって「ヌルポインタ」で終わるのではない。
ナル文字とは「全てのビットが0である文字」と規格され、'\0'で表す値がゼロのchar型のことである。
確かにstdio.hで#define NULL 0と書かれているので'\0'と書いても0と定数で書いても間違いではないことが多い。
だが0と言うものが定数であるのかヌルポインタであるのか分からないときがある。
main() { int *p=6; }
と記述すると”警告 W8069 null.c 3: 移植性のないポインタ変換(関数 main )”と警告が出る。(bolandC++compiler)
これは当然、定数であるint型がポインタに変換されているからである。
だが
main() { int *p=0; }
とすると警告文が消える。これは
「コンパイラがNULLポインタであると勝手に判断したから」
おこるわけである。
コンパイラは
- プロトタイプ宣言していない関数の引数
- 可変長引数の関数の、可変部の引数
と言う局面ではポインタとして扱うべき文脈が分からない。
プロトタイプ宣言がしてあれば分かるのでプロトタイプ宣言は絶対行うようにする。
最終的な結論としては
文字列の終端には'\0'を使っておけば良し。
と言うことである。