こんにちは。ぐぅです。

先日まで、研修で C 言語を猛勉強していました。

 

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 文字は文字列を含むプログラムをコンパイルしたときに、コンパイラによって文字列の最後に格納されます。

※コンパイルとは人が書いたプログラムコードをコンピュータが読めるように翻訳することで、コンパイラとは翻訳を行うもの(=通訳さん)のことです。