ナル文字とは?
C言語の文字列はchar型の配列になりますが、その終端文字に「ナル文字(\0)」を使います。ちなみに、コンパイラが自動で入れてくれます。
ナル文字は要は「値がゼロであるint型」と同じことになります。(\0はNULLのことを指しており、ASCIIコードの制御文字のことをさしていて実体は整数の0と同じということ。)
例
1 2 |
char str[4] = "abc"; ['a', 'b', 'c', '\0'] |
というcharの配列になります。最後の「'\0'」がナル文字になります。
なお、このナル文字を意図的に消してしまった場合(上記例で言えば、str[3]="d"などと代入した場合に消えてしまいます。)はchar配列を表示させようとした場合にひたすらずっと不明なデータを読み込ませるような挙動になってしまうので注意です。
例えば、char配列をfor文で回すような以下の処理の場合にナル文字がないとエラーになってしまいます。(配列外のメモリアクセス違反が発生して異常終了します。)
1 2 3 |
for (i = 0;str[i] != '\0'; i++) { src[i]; } |
また、C言語ではナル文字が終端であることを利用した関数などがありそれも異常な挙動になります。(例:printf関数)
ヌルポインタとの違いは?
ヌルポインタは、stdio.hにてマクロ定数で「0」で初期化されているので「ナル文字」と同じなのではと思うかもしれません。
実際の所は異なりますが、コンパイラの働きによって実質的には同じように動いてしまいます。
なので、例えばポインタ変数にint型の3を入れた場合はコンパイルエラーになります。
1 2 3 4 5 |
int main() { int *b; b = 3; //コンパイルエラー } |
しかし、0を入れるとコンパイルエラーになりません。
1 2 3 4 5 |
int main() { int *b; b = 0; //コンパイルエラーにならない。 } |
要は、コンパイラが「0」という定数をヌルポインタとして特別扱いをしているのです。
処理系の違いによってもほとんど変わりません。
文字の終端にヌルポインタは使えるか?
ナル文字とヌルポインタは同じ「0」を示しているので文字の終端にヌルポインタも使えるのではないかということですが、結論から申しますと使わない方がよいでしょう。
処理系によっては、ヌルポインタは「0」以外を示すことがあるためです。(もちろん、プログラム上でヌルポインタとして使いたい場合は、普通に使えばよいと思いますが。)
この記事へのコメントはありません。