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

C++ 在Xcode 6.3下,空C++;引用地址的计算结果为非零,c++,xcode,pointers,memory-alignment,type-safety,C++,Xcode,Pointers,Memory Alignment,Type Safety,与这个问题类似: 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) {

与这个问题类似:

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 pointer\n");
    }

    return 0
}
这个总是打印出来的
不是空指针

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

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
的值时,您正在检查引用的地址。

引用没有地址,无法保证它们有地址,因为它们可能根本没有存储。询问引用的地址会得到引用对象的地址。非常感谢,杰克。我认为“请求引用的地址会产生引用对象的地址”值得添加到下面的答案中。这是一个启示。但是打印地址给我的结果是零,这真是令人毛骨悚然……谢谢。“定义不明确的代码”相当令人震惊。我试着把
mys
转换成
int
intptr\t
等等。值本身也是零。它甚至可以在关闭优化时工作。但随着优化,它停止工作。无论如何,我知道原始代码不是很好的实践。但我看到的价值观与直觉相反。