由于去引用nullptr (NULL)在C和C++中都是一种未定义的行为,我想知道如果ptr是nullptr (NULL),表达式&(*ptr)是否有效。
如果它也是一种未定义的行为,那么链接答案中的OFFSETOF宏是如何工作的?
我一直认为ptr->field是(*ptr).field的缩写
我认为我的问题的答案在C和C++中是相似的。
发布于 2016-07-27 14:15:30
TL;&(*(char*)0)博士有很好的定义。
C++标准并没有说空指针的间接方向本身就有UB。现行标准草案,[expr.unary.op]
除非将间接表达式的lvalue转换为rvalue,否则不存在UB。
C标准要明确得多。C11标准草案第6.5.3.2节
发布于 2016-07-27 14:37:00
如果它也是一种未定义的行为,
offsetof是如何工作的?
更喜欢使用宏。本地版本会导致编译器警告。此外:
offsetof必须按照上面的规定工作,即使涉及的任何类型都重载了一元operator&。这不能在标准C++中实现,需要编译器的支持。
offsetof是gcc的内置功能。
https://stackoverflow.com/questions/38615436
复制相似问题