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
相关产品推荐
相关产品推荐

