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 | ゼロ |
’¥0’ | 終端文字円ゼロ |
NULL | ヌルポインタ |
”” | 空文字列 |
参考:
CFAQ-5.1: そもそもこの悪名高いヌルポインターとは何か。
http://www.kouno.jp/home/c_faq/c5.html#0