C / C ++ nullptr dereference

时间:2016-07-27 14:11:27

标签: c++ c null nullptr

由于取消引用nullptrNULL)是CC++中未定义的行为,我想知道表达式&(*ptr)是否有效一个,如果ptr是nullptrNULL)。

如果它也是未定义的行为,链接答案中的OFFSETOF宏如何工作?

我一直认为ptr->field(*ptr).field

的简写

我认为我的问题的答案在C和C ++中是类似的。

2 个答案:

答案 0 :(得分:2)

TL; DR &(*(char*)0)定义明确。

C ++标准并没有说空指针本身的间接具有UB。目前的标准草案[expr.unary.op]

  
      
  1. 一元*运算符执行间接:它所应用的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是一个左值,指向对象或函数表达点。如果表达式的类型是“指向T的指针”,则结果的类型为“T”。 [剪断]

  2.   
  3. 一元&的结果operator是指向其操作数的指针。操作数应为左值或限定ID。 [剪断]

  4.   

除非将间接表达式的左值转换为右值,否则没有UB。

C标准更明确。 C11标准草案§6.5.3.2

  
      
  1. 一元&运算符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“指向类型的指针”。 如果操作数是一元*运算符的结果,则该运算符和&运算符都不是。运算符被计算,结果就好像两个都被省略,除了对运算符的约束仍然适用且结果不是左值。类似地,如果操作数是[]运算符的结果,则&运算符和[]所暗示的一元*被评估,结果就像是   &安培;删除了运算符,并将[]运算符更改为+运算符。否则,结果是指向由其操作数指定的对象或函数的指针。
  2.   

答案 1 :(得分:1)

  

如果它也是未定义的行为,offsetof如何工作?

首选使用the standard offsetof macro。自行开发的版本会导致编译器警告。此外:

  

offsetof必须按照上面指定的方式工作,即使一元operator&因所涉及的任何类型而重载。这不能在标准C ++中实现,需要编译器支持。

offsetofbuilt-in function in gcc