int型の変数へのNULL代入について

投稿者: Anonymous
int number;

number = NULL;

と書いたときに、コンパイル時に

warning: assignment makes integer from pointer without a cast [-Wint-conversion]

というメッセージがでます。

コンパイルは成功し、プログラムは意図した挙動で動作するのですが、この警告は何に対する警告なのでしょうか。

stdio.hをincludeしNULLを使っています。

コンパイラは
gcc version7.3.0(Ubuntu7.3.0-27ubuntu1~18.04)
です。よろしくお願い致します。

解決

まず、intは整数を格納する型です(今はビット長は気にしないことにします)
次に、NULLはポインター型と言って、変数のアドレスを格納する型の先頭アドレスを指す値です。

 このため、整数を入れるための型にアドレスを指し示す値をそのまま代入しているので警告が出ているのです。

 代入なのでa = bとしたときに、aの型とbの型がおなじである事が望まれるのは理解出来ますよね?
では、int number = NULLとしたときのそれぞれの型は、int = void *
となり、代入の左右の型が一致しません。これが、おなじ型同士の代入じゃないよという警告として表示されているのです。

 大抵は、その値と見做して良いなら、

int number = (int)NULL;

 と書けば、その警告はされませんが、NULLはポインター型で、値が設定されていない事を明示的に宣言するためのシンボルなので、素直に

int number = 0;

 と書く方が正しいと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *