C 标准的哪一部分涵盖通过空指针调用方法

Which part of the C++ standard covers calling a method via a null pointer?

本文关键字:空指针 调用 方法 标准 一部分      更新时间:2023-10-16

堆栈上有许多问题,解释了以下是C 中的未定义行为:

MyType* p = nullptr;
p->DoSomething();

,但我找不到引用C 标准的一个。C 11和/或C 14标准的哪一部分表示这是不确定的行为?

c 14 [expr.ref]/2:

表达式 E1->E2转换为等效形式 (*(E1)).E2

c 14 [expr.unary.op]/1:

单元*操作员执行间接:应用其应用的表达式应为对象类型的指针,或指向函数类型的指针,结果是指对象的lvalue或函数表达式点

指针没有指向对象,因此该报价不能定义*p的行为。标准中的其他地方都没有定义它,因此它是未定义的行为。

关于是否可以说零指针指向对象,n4618 [basic.compound]/3将指针值定义为:

指针类型的每个值是以下之一:

  • 指向对象或函数的指针(说指向对象或函数指向),或
  • 一个指针越过对象的末端或
  • 该类型的零指针值或
  • 无效的指针值。

表明空指针值不指向对象。