【发布时间】:2016-12-01 14:38:51
【问题描述】:
由于取消引用 nullptr (NULL) 在 C 和 C++ 中都是未定义的行为,我想知道如果 ptr 是 nullptr (@987654329) 表达式 &(*ptr) 是否有效@)。
如果它也是未定义的行为,链接答案中的OFFSETOF 宏如何工作?
我一直以为ptr->field是(*ptr).field的简写
我认为我的问题的答案在 C 和 C++ 中是相似的。
【问题讨论】:
-
C11 标准草案 n1570:6.5.3.2 地址和间接运算符 3 一元 & 运算符产生其操作数的地址。如果操作数的类型为“type”,则结果的类型为“pointer to type”。如果操作数是一元 * 运算符的结果,则该运算符和 & 运算符都不会被计算,结果就好像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值。我>
-
我将此标记为重复,但请务必阅读 C++ 答案下的讨论以及 this discussion,因为这在 C++ 标准中并不十分明确。
-
我怀疑这是重复的,因为 OP 询问“如果取消引用
nullptr是 UB,offsetof 是如何工作的” -
@TartanLlama 由于我找不到在 c++ 中使用
&*NULL的等效豁免,我怀疑这可能是两种语言分歧的地方之一。假设的副本只有在删除c-tag 时才能存在。 -
识别出的重复没有回答这个问题。