可能重复:
引用不能为 NULL 还是可以为 NULL?
下面的程序如何编译成功?
int main()
{
int *ptr = NULL;
int &ref = *ptr;
return 0;
}
在ideone上看到它。
我们可以定义对 NULL 的引用吗?
可能重复:
引用不能为 NULL 还是可以为 NULL?
下面的程序如何编译成功?
int main()
{
int *ptr = NULL;
int &ref = *ptr;
return 0;
}
在ideone上看到它。
我们可以定义对 NULL 的引用吗?
您给出的代码将编译,因为编译器不会在编译时检查指针的值。但是,取消引用 NULL 指针是未定义的行为。
这是我过去遇到过一次并刻在记忆中的问题。我的进一步想法可以在这里找到:https ://stackoverflow.com/a/57656/5987
取自C++ 常见问题解答:
C++ 标准定义的 C++ 语言说它是非法的;这使它成为非法的。C++ 标准不需要对这个特定错误进行诊断,这意味着您的特定编译器没有义务注意到 p 为 NULL 或给出错误消息,但它仍然是非法的。C++ 语言也不需要编译器生成会在运行时崩溃的代码。
您取消引用空指针。您的编译器没有义务抱怨这种格式错误的程序。但是,这并不意味着在运行此程序时不会发生任何不好的事情。
从 C++03 8.3.2/4 开始:
注意:特别是,在定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的“对象”,这会导致未定义的行为。
不,ptr 是一个有地址的指针。您将该指针设置为空。所以该指针的值为空。但是指针本身有一个地址。引用被设置为指针的地址 - 而不是它的值。
现在引用 NULL 本身 - 这将失败。例如:
int &ref = &NULL; // fail