2
int f(int *x)
{
    *x = 5;
    return *x;
}

int main()
{
    int * y = 0;
    int z = f(y);
}

このコードで実行時エラーが発生するのはなぜですか?

4

5 に答える 5

10

このコードで実行時エラーが発生するのはなぜですか?

yNULLポインタであるため、で逆参照されf()ます。NULLポインタを逆参照することは未定義の動作であることに注意してください。

ポインタを逆参照して整数を返すことはできますか?

はい、ポインタが有効なを指していると仮定しますint。例えば:

int main()
{
    int y = 0;
    int z = f(&y);
}
于 2013-03-18T14:44:18.553 に答える
7

ポインタが有効なメモリを指している場合は、可能です。あなたの場合、未定義動作(別名UB)であるNULL(0x00)ポインターを逆参照しています。たとえば、これは正常に機能します。

int f(int *x)
{
    *x = 5;
    return *x;
}

int main()
{
    int value = 1986;
    int *y = &value; // Point to something valid.
    int z = f(y);
}
于 2013-03-18T14:44:28.630 に答える
3

の後int *y = 0;yは、何も指さない(アドレスを指す0)ポインタだからです。コードは次のようになります。

int * y = new int;
*y = 0;
int z = f(y);
// ...
delete y;

また

int y = 0;
int z = f(&y);
于 2013-03-18T14:45:55.827 に答える
1

あなたはそれをポインタにするポインタを設定していyます:0NULL

int * y = 0;

次に、ここでポインタに対して間接参照を実行しようとしています。f()

*x = 5;
^ 

次の行では、未定義の動作です。ドラフトC++標準セクションを見ると、8.3.2 参照段落5は次のように述べています。

[...]注:特に、null参照を作成する唯一の方法は、nullポインターを介した間接参照によって取得された「オブジェクト」にバインドすることであるため、明確に定義されたプログラムにnull参照を存在させることはできません。未定義の動作を引き起こします。[...]

于 2013-03-18T14:46:05.383 に答える
1

逆参照の前にポインターをチェックし、常にエラーの動作を指定します。

int f(int *x)
{
   if ( x )
   {
     // do something with x
   }
   else
   {
     // do something else in case null pointer
   }
}

あなたの場合のように、ヌルポインターを逆参照すると、ヌルポインター例外が発生します。

于 2013-03-18T14:48:22.197 に答える