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
■クイズ
●クイズのヒント(コンパイルエラーにならないのはどれ?)
#include <stdio.h>
int main(void){
printf("%p\n",&NULL);
printf("%p\n",&'\0');
printf("%p\n",&"");
printf("%p\n",&0);
}