【发布时间】:2013-03-18 14:42:57
【问题描述】:
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
为什么这段代码会出现运行时错误?
【问题讨论】:
标签: c++ pointers undefined-behavior
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
为什么这段代码会出现运行时错误?
【问题讨论】:
标签: c++ pointers undefined-behavior
为什么这段代码会出现运行时错误?
因为y 是一个NULL 指针,它在f() 中被取消引用。请注意,取消引用 NULL 指针是未定义的行为。
你可以通过取消引用指针来返回一个整数吗?
是的,假设指针指向一个有效的int。例如:
int main()
{
int y = 0;
int z = f(&y);
}
【讨论】:
如果指针指向某个有效内存,则可以。在您的情况下,您是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);
}
【讨论】:
因为在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;
^
在下一行,即undefined behavior。如果我们查看draft C++ standard 部分8.3.2 参考 段5 说:
[...] 注意:特别是,空引用不能存在于定义良好的程序中,因为创建此类引用的唯一方法是将其绑定到通过 null 间接获得的“对象”指针,这会导致未定义的行为。 [...]
【讨论】: