引用NULL

时间:2012-07-31 20:40:28

标签: c++

  

可能重复:
  A reference can not be NULL or it can be NULL?

以下程序如何成功编译?

int main()
{
   int *ptr = NULL;
   int &ref = *ptr;
   return 0;
}

ideone上查看。

我们可以定义对NULL的引用吗?

4 个答案:

答案 0 :(得分:6)

您编写的代码将编译,因为编译器在编译时不检查指针的值。但是,取消引用NULL指针是未定义的行为。

这是我过去遇到的一个问题,并被烧进了我的记忆中。我的进一步想法可以在这里找到:https://stackoverflow.com/a/57656/5987

答案 1 :(得分:4)

取自the C++ FAQ

  

C ++标准定义的C ++语言表示它是非法的;这使它成为非法的。 C ++标准不需要对此特定错误进行诊断,这意味着您的特定编译器没有义务注意到p为NULL或提供错误消息,但它仍然是非法的。 C ++语言也不需要编译器生成在运行时会爆炸的代码。

答案 2 :(得分:1)

您取消引用空指针。你的编译器没有被要求抱怨这样的不良程序。然而,这并不意味着在运行此事时你不会发生任何不好的事情。

来自C ++ 03 8.3.2 / 4:

  

注意:特别是,在明确定义的程序中不能存在空引用,因为唯一   创建这样一个引用的方法是将它绑定到通过解除引用空指针获得的“对象”,   这会导致未定义的行为。

答案 3 :(得分:-3)

没有。 ptr是一个具有地址的指针。您将该指针设置为null。所以该指针的值为null。但指针本身有一个地址。引用被设置为指针的地址 - 而不是其值。

现在引用NULL本身 - 这会失败。 e.g:

int &ref = &NULL; // fail