指针的相互赋值疑惑

iastro 2020-01-09 10:16:03
#include <iostream>

using namespace std;

int main()
{
int *pn;
char *pc;
char c = 0x65;
pn = (int *)&c;
int n = *pn;
*pn = 0x12345678;
cout << "*pn: " << hex << *pn << dec << endl;
cout << "n: " << hex << n << dec << endl;
return 0;
}

这段程序执行后的结果是:
*pn: 12345678
n: 123456
比较疑惑,这句 int n = *pn; 意思是n的值为*pn的值,此时*pn的值为0x65,即n的值是0x65,此后应该不变,为什么执行 *pn = 0x12345678; 后,n的值变为0x123456了,希望高手答疑解惑,在这里谢谢了!
...全文
302 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序代码 2020-01-10
  • 打赏
  • 举报
回复
n的输出是不确定的值吧
零隐 2020-01-10
  • 打赏
  • 举报
回复
这个都乱了,不可探究。
寻开心 2020-01-10
  • 打赏
  • 举报
回复
这种操作后果就是未知的
刚才做了一个实验
dev c 运行就是楼主的那种情况
vs 2019 debug模式 运行到这里出现错误, 堆栈在变量c附近被破坏了
Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.
局部变量是在栈内存分配的,对c操作越界破坏就是栈的数据
寻开心 2020-01-10
  • 打赏
  • 举报
回复
前面说过了,和编译器相关

局部变量在栈当中的位置关系是编译器自己定义的, 不是c/c++标准定的
算什么男人000 2020-01-10
  • 打赏
  • 举报
回复
n的值哪里变了,没有变,一直都是(int *)&c这里指向的值,c取地址强制转换成(int*)之后*pn值是-858993563,所以n的值一直都是-858993563。你调试下不就晓得了。
真相重于对错 2020-01-10
  • 打赏
  • 举报
回复
引用 3 楼 iastro 的回复:
[quote=引用 2 楼 真相重于对错 的回复:] n也变了?你确定????
是的 你执行下就知道了[/quote]
iastro 2020-01-09
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
n也变了?你确定????
是的 你执行下就知道了
真相重于对错 2020-01-09
  • 打赏
  • 举报
回复
n也变了?你确定????
寻开心 2020-01-09
  • 打赏
  • 举报
回复
c是char类型, pn指向c, 但是用的是int类型, 所以给*pn赋值的时候,低位0x78给了c,高位内存越界了
而n恰好位于越界的区域里面了
你可以获取n变量的地址,和c变量的地址pn做比较来看

这个结果在不同的编译器上,结果可能不一样;不能把这种方法当作用来改变n的必然有效的技术来使用, 因为变量在内容当中的相对位置关系是编译器自己决定的,并不是c/c++的标准, 换了环境编译可能就无效了

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧