对NULL的引用

Reference to NULL

本文关键字:引用 NULL      更新时间:2023-10-16

可能重复:
引用不能为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:

注意:特别是,null引用不能存在于定义良好的程序中,因为创建这样一个引用的方法是将其绑定到通过取消引用空指针获得的"对象",这会导致未定义的行为。

否。ptr是一个有地址的指针。您将该指针设置为null。因此,该指针的值为null。但是指针本身有一个地址。引用被设置为指针的地址,而不是其值。

现在,对NULL本身的引用将失败。例如:

int &ref = &NULL; // fail