你能通过对指针解引用返回一个整数吗?

Can you return an integer by dereferencing a pointer?

本文关键字:一个 整数 返回 指针 引用      更新时间:2023-10-16
int f(int *x)
{
    *x = 5;
    return *x;
}
int main()
{
    int * y = 0;
    int z = f(y);
}

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

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

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

可以通过对指针解引用返回整数吗?

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

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

如果指针指向有效内存,则可以。在您的情况下,您正在解引用NULL (0x00)指针,这是未定义的行为(aka 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);
}

因为在int *y = 0;之后,y是一个不指向任何东西的指针(指向地址0)。你的代码应该是这样的:

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

int y = 0;
int z = f(&y);

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

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

对空指针解引用会产生空指针异常,如您的情况。

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

int * y = 0;

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

*x = 5;
^ 

和后面的行,这是未定义的行为。如果我们看一下c++标准草案8.3.2 References段落5说:

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

相关文章: