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

C++指针重赋值为常量地址后所属内存段类型判定问题

问题解答

核心结论

赋值后指针a持有的地址属于栈区,既不属于常量数据段,也不属于自由存储区

细节解释

  • 先明确不同const变量的存储规则:你代码里的const int pi = 10;是main函数内的局部非静态const变量,默认分配在栈内存区域,只有全局const、带static修饰的const常量才会被存到常量数据段。
  • new int申请的内存确实位于自由存储区(堆区),最开始指针a存的就是这块堆内存的地址,和第二次打印的地址一致。
  • 执行a = (int*)π的时候,是直接把pi的栈地址覆盖写入了a,此时a里存的地址就变成了pi的地址,和之前的堆内存彻底没关系了,运行代码你也能看到第三次打印的a地址和第一次打印的&pi地址完全相同。这个操作还会造成内存泄漏:你new出来的int还没释放就丢了地址,再也没法回收了。
  • 额外提醒:你这里用的C风格强制转(int*)&pi是违规操作,强行去掉了const属性,如果你之后写*a = 20这种修改操作,属于C++未定义行为,运行结果完全不可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:39:03