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

C++中同一内存地址出现不同值的原因探究

问题解答

这是编译期常量折叠(Constant Folding)加上未定义行为共同导致的结果,具体拆解如下:

  • 常量折叠的优化逻辑:
    你定义的const int c = 1中,c是一个编译期常量——它被const修饰且初始化值是字面量1,编译器会在编译阶段直接把代码中所有引用c的地方替换成字面量1,而不是在运行时从内存地址读取它的值。从你提到的汇编代码里能看到,std::cout << c这一行直接输出的是常量1,根本没有去访问c对应的内存地址。

  • 指针访问的实际内存值:
    ptr和tmp确实指向了c的内存地址,你通过*tmp = 5修改了这块内存的内容,所以*ptr和*tmp读取的是内存里的实际值5。但c因为被编译器提前替换成了字面量,所以输出时和内存里的值出现了“矛盾”。

  • 注意:这是未定义行为:
    根据C++标准,通过const_cast修改原本声明为const的对象属于未定义行为——编译器可以自由处理这种情况,除了当前的表现外,还可能出现崩溃、输出其他值等任意结果,绝对不能在生产代码中依赖这种操作。

内容的提问来源于stack exchange,提问作者Mr.Donaldo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:51:34