c++ 其中哪一个会创建一个空指针?

该标准说,取消引用空指针会导致未定义的行为.但是什么是“空指针”?在下面的代码中,我们称之为“空指针”:

struct X
{
  static X* get() { return reinterpret_cast<X*>(1); }
  void f() { }
};

int main()
{
  X* x = 0;
  (*x).f(); // the null pointer?  (1)

  x = X::get();
  (*x).f(); // the null pointer?  (2)

  x = reinterpret_cast<X*>( X::get() - X::get() );
  (*x).f(); // the null pointer?  (3)

  (*(X*)0).f(); // I think that this the only null pointer here (4)
}

我的想法是,取消引用空指针只在最后一种情况下发生.我对吗?根据C标准,编译时空指针和运行时是否有区别?

最佳答案
只有第一个和最后一个是空指针.其他的是reinterpret_cast的结果,因此对实现定义的指针值进行操作.行为是否为它们定义取决于您所投射的地址是否有一个对象.

转载注明原文:c++ 其中哪一个会创建一个空指针? - 代码日志