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

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

为什么这段代码会给我一个运行时错误?

4

5 回答 5

10

为什么这段代码会给我一个运行时错误?

因为y是一个NULL指针,它在f(). NULL请注意,取消引用指针是未定义的行为。

您可以通过取消引用指针来返回整数吗?

是的,假设指针指向一个有效的int. 例如:

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

你可以,如果一个指针指向一些有效的内存。在您的情况下,您正在取消引用 NULL ( 0x00) 指针,这是未定义的行为(又名 UB)。例如,这可以正常工作:

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

因为 after int *y = 0;,y是一个指向空的指针(指向 address 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使其0成为指针的NULL指针:

int * y = 0;

然后你试图在这里的指针上执行间接f()

*x = 5;
^ 

并在随后的行中,这是未定义的行为。如果我们查看草案 C++ 标准部分8.3.2 参考5段说:

[...] 注意:特别是,在定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过空指针间接获得的“对象”,这导致未定义的行为。[...]

于 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 回答