【C言語】
¥0は[ヌル文字(NULL文字)]ではなく[終端文字¥0]と書こう

warning: comparison between pointer and zero character constant

警告:ポインタと終端文字’\0’との比較
[-Wpointer-compare]


この記事の概要

C言語でよく混同される「NULLポインタ」と「終端文字¥0」の違いを解説。
ポインタとの正しい比較方法やコード内での適切な表記を初心者向けに分かりやすく紹介します。


■¥0の発音と表記の提案

聖典プログラミング言語C石田晴久訳では
’¥0’をヌル文字と訳されていますが、

ちまたではNULL文字と表記される場合が
非常に多いため、
初心者はNULLと’\0’を混同してしまいます。

そこで提案ですがソースコードレビューやコード中のコメントには以下のように発音、表記すると混乱しないと思います。

NULL
   表記:NULLポインタ 
   発音:ぬるぽいんた
’¥0’ 
   表記:終端文字¥0 
   発音:しゅうたんもじえんぜろ
   または
   発音:しゅうたんもじぎゃくすらぜろ 

■ポインタと終端文字¥0を比較するのは誤り

#include    <stdio.h>
void    ng(char *p)
{
        if(p == NULL)   {
                printf("NULLポインタ\n");
                return  ;    
        }
        if(p == '\0') {//NG:ポインタと終端文字¥0との比較
                printf("空文字列\n");
                return  ;    
        }
}
int main(void)
{
        ng("")   ;
        ng(NULL) ;
}

ポインタと終端文字¥0を比較するのは多くの場合誤りです。
if( p == ‘\0’)  // 「ポインタが終端文字\0」 ではなくて
if( p == NULL) // 「ポインタがNULLポインタ」か
if(*p == ‘\0’) // 「ポインタの指す先が終端文字\0」 の
どちらかでしょう。


■¥0をローカル表現に再定義すると混乱する

#define   ZERO              0U
#define   EOS               '\0'   //end of  string 
#define   NULLPTR           NULL
#define   NULLSTRING        ""

0,NULL,’¥0’,””すら使い分けが
できない場合が多いのに
プロジェクトによってはこのような再定義をする場合があります。

しかし教科書にのっている表現をわざわざローカルな表現にすると
かえって混乱するので避けたほうが良いでしょう。

参考:

C-FAQ5: ヌルポインター

http://www.kouno.jp/home/c_faq/c5.html

■クイズ

71
メモリ上にアドレスを持つのは次のどれでしょうか?

●クイズのヒント(コンパイルエラーにならないのはどれ?)

#include <stdio.h>
int main(void){
    printf("%p\n",&NULL);
    printf("%p\n",&'\0');
    printf("%p\n",&"");
    printf("%p\n",&0);
}