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

C++使用指针时出现非预期输出的原因求解

两条非预期输出的原理解释

先明确核心指针逻辑:q是二级指针,存储的是指针变量p自身的内存地址,因此修改*q的值,本质就是直接修改p存储的地址,和直接给p赋值的效果完全相同。

第7条输出0x7fff568e52e4的产生原因

这条内容是执行完*q = &y;后打印的p的数值:

  • 执行*q = &y;等价于执行p = &y;,也就是把p的指向从原本的变量x,切换为变量y。
  • 从输出地址可以判断你运行在64位环境,int类型占4字节:初始状态下p存的x地址是0x7fff568e52e0,对应x占用0x7fff568e52e0 ~ 0x7fff568e52e3共4字节栈空间。x和y是连续声明的int类型局部变量,在栈上相邻分配,y的存储空间紧挨着x的高地址侧,起始地址正好是0x7fff568e52e4。
  • 因此p改为指向y后,存储的地址值就是y的起始地址0x7fff568e52e4,对应你看到的第7条输出。

第9条输出0的产生原因

这条内容是修改p指向后打印的*p数值,也就是p当前指向的变量y的值:

  • 代码中声明y时没有写任何初始化逻辑,y属于自动存储期的局部变量,C++标准明确规定这类未初始化的局部变量持有不确定值,直接读取该值属于未定义行为,输出结果完全由运行时对应内存位置的残留数据决定,没有固定结果。
  • 你这次运行得到0,是当前编译配置、运行环境下的偶然结果:之前执行的*p = 8;修改的是x所在的0x7fff568e52e0位置的内存,完全不会触碰y的存储空间;很多编译器在Debug模式下会将未使用的栈空间填充为0,或是程序启动时该位置的栈内存初始值恰好为0,都会输出0。如果换编译选项、换运行环境,这个位置的值可能是任意随机数,不会固定为0。

内容的提问来源于stack exchange,提问作者S Ali Mousavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:54:44