49748

[code]

    int number;
    
    number = NULL;
    
[/code]

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

[code]

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

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

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

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

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


CC BY-SA 4.0
2018-10-29T03:19:59.200
49746
2018-10-29T03:57:15.807
2018-10-29T03:57:15.807
3060
30707
question
linux c gcc
int型の変数へのNULL代入について


C言語において、NULLはvoid*型であるようです。このため、

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

という警告は、キャストせずに型が異なるint型へ代入しているため発生しているものと考えられます。


CC BY-SA 4.0
2018-10-29T03:27:50.747
49747
2018-10-29T03:27:50.747
29826
49746
answer


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

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

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

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

[code]

    int number = (int)NULL;
    
[/code]

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

[code]

    int number = 0;
    
[/code]

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


CC BY-SA 4.0
2018-10-29T03:32:36.570
49748
2018-10-29T03:32:36.570
14745
49746
answer