以下のコードでセグメンテーション違反が発生することを期待していました。NULL ポインターは何も指していないため、何も指していないものをインクリメントしても意味がありません。しかし、その印刷は0,4,8,12,16です。
#include<stdio.h>
int main()
{
int *p ,i=0;
p = NULL;
for(i=0;i<5; i++) {
printf("%d\n",p++);
}
return 0;
}
以下のコードでセグメンテーション違反が発生することを期待していました。NULL ポインターは何も指していないため、何も指していないものをインクリメントしても意味がありません。しかし、その印刷は0,4,8,12,16です。
#include<stdio.h>
int main()
{
int *p ,i=0;
p = NULL;
for(i=0;i<5; i++) {
printf("%d\n",p++);
}
return 0;
}
を逆参照しているのではなく、格納されている値を にp
変換しています。あなたがしている場合:int
printf("%d\n",*p++);
次に、セグメント障害になります。
NULL
ポインターを逆参照することはできません (これは行いません)。
むしろ、省略記号内にポインターを渡しているためprintf
、printf は整数を処理していると見なし、安全でないキャストを暗黙的に実行しています (したがって、プログラムは未定義の動作も呼び出しています)。
プログラムには未定義の動作があります。++
演算子は、有効なオブジェクトを指すポインターに対してのみ許可されており、さらにprintf
、フォーマットで指定されている場所にポインター値を渡していますint
。
未定義の動作は、プログラムが動作しているように見えても、何かを引き起こす可能性があります。C は、そのようなコードに対してコンパイル時または実行時チェックを課しません。やらないでください。