你可以通过解除引用指针返回一个整数吗?

时间:2013-03-18 14:42:57

标签: c++ pointers undefined-behavior

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

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

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

5 个答案:

答案 0 :(得分:10)

  

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

因为yNULL指针,因此在f()中取消引用。注意,取消引用NULL指针是未定义的行为。

  

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

是的,假设指针指向有效的int。例如:

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

答案 1 :(得分:7)

如果指针指向某个有效内存,则可以。在您的情况下,您是dereferencing a NULL (0x00) pointer,即undefined behavior(又名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);
}

答案 2 :(得分: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);

答案 3 :(得分:1)

您正在将指针y设置为0,这使其成为NULL指针:

int * y = 0;

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

*x = 5;
^ 

并在后续行中,undefined behavior。如果我们查看draft C++ standard部分8.3.2 参考 5 说:

  

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

答案 4 :(得分:1)

在解除引用之前检查指针并始终指定错误行为:

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

取消引用空指针会产生空指针异常,例如在您的情况下。