こんにちは。ぐぅです。
C 言語を勉強して数日が経過したある日、私は得体の知れないものと出会いました。
それは「 NULL (ヌル)」です。名前からして怪しすぎる…。
NULL について調べてみると以下のような説明がされていました。
「プログラミング言語やデータベースのデータ表現の一種であり、
何のデータも含まれていない状態、または長さ 0 の空文字列のこと」
何のデータも含まれていない状態 … それをわざわざ表現する必要があるのか?
そんな疑問を持たずにはいられませんでした。
しかし研修を進めていくと、 NULL の重要性が少しずつ分かってきました。
今日はそんな NULL の大切さを知ったエピソードについてまとめてみました。
解説
要素の数が 80 個の配列( str[80] )に「 hello 」という文字列( 5 文字)を格納するとします。
char str[80] = “ hello ” ; /*サンプルコード */
そして配列( str[80] )に格納された文字列を下記のコードで出力します。
printf ( “ % s ” , str );
配列の要素(文字が入る箱)の数は 80 個、そして格納された文字は 5 個です。
さて、文字列はどのように出力されるでしょう?
1.hello (終わり) 2.hello + (空白 × 75 ) |
正解は 1 です。
hello /* 出力結果 */
これは考えなくても分かりますよね。
当たり前すぎて、何でこんなこと質問するの?と思う方もいるでしょう。
ここで一つ、衝撃の事実です。
実は printf () 関数は、文字列がどこからスタートするのかしか分かりません。
これはどういうことかというと…
「 hello 」を出力したいとき、出力のスタートである「 h 」の場所は分かりますが
出力のゴールである「 o 」の位置は分かりません。
つまり、 hello の文字を出力した後も出力が止まらないということです。
ということは、先ほどの質問の答えは「 2 . hello + (空白× 75 ) 」になるのでは?
と思いませんか?
なぜ出力は「 hello 」だけなのか?
この問題のポイントこそが「 NULL 」です!
「 NULL 」は文字列を配列に格納すると、自動的に文字列の最後に入ります。
そして NULL は文字列の終わりを教えてくれます。
( NULL に到達したら文字列が終わりということ)
これにより、 printf () 関数で文字列を出力しても、格納した文字だけが表示されたのです!
まとめ
文字列の最後に NULL が格納されることで、文字列の終わりを示している。
ぐぅのつぶやき
存在感がないと思っていた NULL だけど、実は見えない所で大活躍していたんだなぁ。
補足
厳密には、 NULL 文字は文字列を含むプログラムをコンパイルしたときに、コンパイラによって文字列の最後に格納されます。
※コンパイルとは人が書いたプログラムコードをコンピュータが読めるように翻訳することで、コンパイラとは翻訳を行うもの(=通訳さん)のことです。