首页
学习
活动
专区
圈层
工具
发布

C/C++
EN

Stack Overflow用户
提问于 2016-07-27 14:11:27
回答 2查看 3K关注 0票数 2

由于去引用nullptr (NULL)在CC++中都是一种未定义的行为,我想知道如果ptr是nullptr (NULL),表达式&(*ptr)是否有效。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-27 14:15:30

TL;&(*(char*)0)博士有很好的定义。

C++标准并没有说空指针的间接方向本身就有UB。现行标准草案,[expr.unary.op]

  1. 一元*操作符执行间接操作:应用它的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式所指向的对象或函数的lvalue。如果表达式的类型是“指向T的指针”,则结果的类型是“T”。剪辑
  2. 一元&运算符的结果是指向其操作数的指针。操作数应该是一个值或一个限定id.剪辑

除非将间接表达式的lvalue转换为rvalue,否则不存在UB。

C标准要明确得多。C11标准草案第6.5.3.2节

  1. 一元&运算符产生其操作数的地址。如果操作数具有" type“类型,则结果具有”指向类型的指针“类型。如果操作数是一元*运算符的结果,则既不计算该运算符,也不计算&运算符,结果就好像两者都被省略了一样,但对运算符的约束仍然适用,且结果不是lvalue。类似地,如果操作数是[]运算符的结果,则不计算[]所隐含的&运算符或一元*,结果就好像移除了&运算符,并将[]运算符更改为+运算符。否则,结果是指向其操作数指定的对象或函数的指针。
票数 4
EN

Stack Overflow用户

发布于 2016-07-27 14:37:00

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

更喜欢使用。本地版本会导致编译器警告。此外:

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

offsetofgcc的内置功能

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38615436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档