关于(void*) ptr == ptr是否恒成立的C标准合规性问询
关于C标准中
(void*)ptr == ptr是否恒成立的解答 好问题!你其实没误解C标准第6.3.2.3第1段的内容,但要搞清楚(void*)ptr == ptr是否恒成立,得结合指针比较的规则来看,而不是只看指针转换的条款。
首先回顾你提到的标准核心内容:
6.3.2.3 Pointers 1 指向void的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针转换为指向void的指针后再转换回原类型,结果应与原指针相等。
这段的核心是保证往返转换的安全性——把对象指针转成void*再转回原类型,一定和原指针完全一致,但它没直接说明(void*)ptr == ptr的比较结果,这是因为这个比较的行为由C标准的另一部分(6.5.9 指针比较)定义。
当你写出(void*)ptr == ptr这样的代码时,C标准会触发隐式类型转换:由于比较的两边一个是void*类型,另一个是对象类型指针,根据6.5.9第3条的规则,对象类型指针会被自动转换成void*类型,之后再进行比较。这时候你本质上是在比较(void*)ptr和(void*)ptr——同一个指针转换而来的void*值,结果必然相等。
哪怕是极端的编译器实现场景(比如对象指针是16位,void*是32位,转换时做零扩展),比较时的隐式转换也会把对象指针统一转成void*类型,两边的值依然一致,比较结果还是相等。
总结一下:(void*)ptr == ptr是恒成立的,这是指针转换规则与指针比较规则共同作用的必然结论,因此标准不需要单独对这一点做出规定。
内容的提问来源于stack exchange,提问作者Yastanub
相关产品推荐
相关产品推荐

