在 Xcode 6.3 下,NULL C++引用地址的计算结果为非零

Under Xcode 6.3, NULL C++ reference address evaluates as non-zero

本文关键字:计算 地址 结果 引用 C++ Xcode NULL      更新时间:2023-10-16

类似于这个问题:XCode 6.3 警告:"myObject"的地址比较不等于空指针总是正确的

使用 C++,我发现以前用于评估空指针的工作代码停止工作:

struct AStruct
{
    int x, y;
    char *name;
};
AStruct& GetStruct()
{
   return *(AStruct*)0;
}
int main(int argc, const char * argv[]) {
    AStruct& mys = GetStruct();
    if ( ! &mys) {
        printf("null pointer n");
    }
    else
    {
        printf("NOT a null pointern");
    }
    return 0
}

这总是打印出来 NOT a null pointer

我尝试了其他指针到引用检查的方法:

if ( &mys == NULL)

if ( &mys == nullptr )

这些都不起作用。

然后我注意到警告:

Reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to false

但是没有建议的修复。

如今检查空指针的规范方法是什么?

您不是在检查指针,而是在检查引用。

不应nullptr引用,因为它们必须引用现有值。事实上,你正在做的事情*(AStruct*)0没有很好地定义,因为引用不应该能够通过"取消引用它"来生成未定义的行为,但通过这种方式,你可能会触发问题。

如果客户端代码具有AStruct&则可以确定引用指向某些内容,您正在破坏此条件。

如果您需要使用可以为 null 的引用,请使用指针,例如

AStruct* GetStruct()
{
  return nullptr;
}
if (!GetStruct())
{
  ...

代码在以前版本的 Xcode 中工作的事实表明这不是定义良好的代码。

你那里没有指针; mys是一个参考。然后,当您检查 &mys 的值时,您正在检查引用的地址。