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
等等。值本身也是零。它甚至可以在关闭优化时工作。但随着优化,它停止工作。无论如何,我知道原始代码不是很好的实践。但我看到的价值观与直觉相反。