-2

以下のコードでセグメンテーション違反が発生することを期待していました。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;
}
4

3 に答える 3

3

を逆参照しているのではなく、格納されているを にp変換しています。あなたがしている場合:int

printf("%d\n",*p++);

次に、セグメント障害になります。

于 2013-10-04T10:38:41.097 に答える
2

NULLポインターを逆参照することはできません (これは行いません)。

むしろ、省略記号内にポインターを渡しているためprintf、printf は整数を処理していると見なし、安全でないキャストを暗黙的に実行しています (したがって、プログラムは未定義の動作も呼び出しています)。

于 2013-10-04T10:40:46.660 に答える
1

プログラムには未定義の動作があります。++演算子は、有効なオブジェクトを指すポインターに対してのみ許可されており、さらにprintf、フォーマットで指定されている場所にポインター値を渡していますint

未定義の動作は、プログラムが動作しているように見えても、何かを引き起こす可能性があります。C は、そのようなコードに対してコンパイル時または実行時チェックを課しません。やらないでください。

于 2013-10-04T12:03:04.730 に答える