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

