int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
このコードで実行時エラーが発生するのはなぜですか?
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
このコードで実行時エラーが発生するのはなぜですか?
このコードで実行時エラーが発生するのはなぜですか?
y
はNULL
ポインタであるため、で逆参照されf()
ます。NULL
ポインタを逆参照することは未定義の動作であることに注意してください。
ポインタを逆参照して整数を返すことはできますか?
はい、ポインタが有効なを指していると仮定しますint
。例えば:
int main()
{
int y = 0;
int z = f(&y);
}
ポインタが有効なメモリを指している場合は、可能です。あなたの場合、未定義動作(別名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);
}
の後int *y = 0;
にy
は、何も指さない(アドレスを指す0
)ポインタだからです。コードは次のようになります。
int * y = new int;
*y = 0;
int z = f(y);
// ...
delete y;
また
int y = 0;
int z = f(&y);
あなたはそれをポインタにするポインタを設定していy
ます:0
NULL
int * y = 0;
次に、ここでポインタに対して間接参照を実行しようとしています。f()
*x = 5;
^
次の行では、未定義の動作です。ドラフトC++標準セクションを見ると、8.3.2
参照段落5は次のように述べています。
[...]注:特に、null参照を作成する唯一の方法は、nullポインターを介した間接参照によって取得された「オブジェクト」にバインドすることであるため、明確に定義されたプログラムにnull参照を存在させることはできません。未定義の動作を引き起こします。[...]
逆参照の前にポインターをチェックし、常にエラーの動作を指定します。
int f(int *x)
{
if ( x )
{
// do something with x
}
else
{
// do something else in case null pointer
}
}
あなたの場合のように、ヌルポインターを逆参照すると、ヌルポインター例外が発生します。