由于取消引用nullptr
(NULL
)是C
和C++
中未定义的行为,我想知道表达式&(*ptr)
是否有效一个,如果ptr是nullptr
(NULL
)。
如果它也是未定义的行为,链接答案中的OFFSETOF宏如何工作?
我一直认为ptr->field
是(*ptr).field
我认为我的问题的答案在C和C ++中是类似的。
答案 0 :(得分:2)
TL; DR &(*(char*)0)
定义明确。
C ++标准并没有说空指针本身的间接具有UB。目前的标准草案[expr.unary.op]
一元*运算符执行间接:它所应用的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是一个左值,指向对象或函数表达点。如果表达式的类型是“指向T的指针”,则结果的类型为“T”。 [剪断]
- 醇>
一元&的结果operator是指向其操作数的指针。操作数应为左值或限定ID。 [剪断]
除非将间接表达式的左值转换为右值,否则没有UB。
C标准更明确。 C11标准草案§6.5.3.2
- 一元&运算符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“指向类型的指针”。 如果操作数是一元*运算符的结果,则该运算符和&运算符都不是。运算符被计算,结果就好像两个都被省略,除了对运算符的约束仍然适用且结果不是左值。类似地,如果操作数是[]运算符的结果,则&运算符和[]所暗示的一元*被评估,结果就像是 &安培;删除了运算符,并将[]运算符更改为+运算符。否则,结果是指向由其操作数指定的对象或函数的指针。
醇>
答案 1 :(得分:1)
如果它也是未定义的行为,
offsetof
如何工作?
首选使用the standard offsetof
macro。自行开发的版本会导致编译器警告。此外:
offsetof
必须按照上面指定的方式工作,即使一元operator&
因所涉及的任何类型而重载。这不能在标准C ++中实现,需要编译器支持。
offsetof
是built-in function in gcc。