You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于整数存入void指针的往返安全性及断言有效性的标准确认

你的理解完全正确!

咱们先把C++标准里关于reinterpret_cast在指针和整数之间转换的核心规则掰扯清楚:

  • 标准只单向保证一种往返转换的有效性:如果你把一个有效的指针值转换为intptr_t(或者其他足够大的整数类型),再把这个整数转换回原来的指针类型,得到的指针必须和原指针完全相等。
  • 但反过来的情况——也就是把一个整数(哪怕是intptr_t类型的)转换为指针,再转回到整数——标准没有任何保证,完全是实现定义的行为。

回到你贴的这段代码:

intptr_t x = 5; 
void* y = reinterpret_cast<void*>(x); 
assert(x == reinterpret_cast<intptr_t>(y));

这里存在两个关键问题:

  1. 第一步reinterpret_cast<void*>(x):把整数5转成void*,标准不保证这个转换是合法的——有些平台可能不允许非指针来源的整数直接转成指针(比如5可能对应一个无效的内存地址,或者平台的指针编码规则不支持这个值),这一步本身就是由编译器实现决定行为。
  2. 第二步转回intptr_t:就算第一步转换成功了,标准也没规定转回来的整数必须等于原来的5。正如你提到的,同一指针在不同实现里可能对应多种整数表示,反过来的转换自然也无法保证还原出初始的整数值。

所以你认为这段代码的行为不被C++标准保证,这个判断是完全准确的。

内容的提问来源于stack exchange,提问作者zse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:49