【C言語】
0,’¥0′,NULL,””の違い

0,’¥0′,NULL,””の違い

warning: initialization of ‘char’ from ‘void *’ makes integer from pointer without a cast

警告: ‘void *’ で ‘char’ 変数を初期化した
[-Wint-conversion]


どの行が駄目ですか?

#include <stdio.h>
#include <string.h>

#define put(X)  printf("%s\t:\t[%s]\n",#X, buf)

int     main(void){
    char    buf[64]={0};
    memset(buf,0,   sizeof(buf)-1);   put(0);
    memset(buf,'\0',sizeof(buf)-1);   put('\0');
    memset(buf,'0', sizeof(buf)-1);   put('0');
    memset(buf,NULL,sizeof(buf)-1);   put(NULL);
    memset(buf,"",  sizeof(buf)-1);   put("");
}

コンパイル時警告が出るのはどの行ですか?
暴走する可能性があるのはどの行ですか?


■0,’¥0′,NULL,””の違いがわからない

#include    <stdio.h>
#include    <string.h>
int f1(void)
{
    int     i = NULL ;
    char    str[1024] = {NULL}; 
    memset(str,NULL,sizeof(str))    ;
    if(str[0] == NULL){
        return  1 ;
    }
    return  NULL ;
}

NULLポインタが
#define NULL ((void *)0)  ではなくて
#define NULL   0 と定義されていて、
かつ「0はマジックナンバなので使用してはいけません。」
教育された初級者がよくこの間違ったコードを記述します。


■0,’¥0′,NULL,””を使い分けた例

int f2(void)
{
    int     i = 0 ;
    char    str[1024] = {'\0'}; 
    memset(str,0,sizeof(str))    ;
    if(str[0] == '\0'){
        return  1 ;
    }
    return  0 ;
}

日本では記号定数 NULL を【ヌル】とか【ナル】と発音しますが、この発音では NULL がポインタである事がよくわからないので
初級者の人は NULLを
【0】、【’¥0’】 、【””】とよく混同します。


NULLは【ヌル】ではなく【ヌルポインタ】と発音しよう

そこで提案ですがソースコードレビューでの読み上げの時は
【ヌル】とか【ナル】の2文字で終わらないで
【ヌルポインタ】とか【ナルポインタ】とポインタを強調すると
混乱しないと思います。
NULL
   表記:NULLポインタ 
   発音: 【ヌルポインタ】か【ナルポインタ
 

0、’¥0’、NULL、””を読み分けて違いを明確にしましょう。

C言語表記読み方
ゼロ
’¥0’終端文字円ゼロ
NULLヌルポインタ
””空文字列

参考:

CFAQ-5.1: そもそもこの悪名高いヌルポインターとは何か。

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