北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 2227|回复: 9

【程序员进】关于c++中同一地址存在多个数值的问题

[复制链接]
发表于 2013-6-8 17:03:58 | 显示全部楼层 |阅读模式
前几天一时兴起,想尝试着在类外面访问私有成员,然后通过指针操作地址的方式搞定了,顿时觉得指针这东西太不和谐了

今天又一时兴起,想尝试着用指针修改const变量的值,然后就写出了这么一个蛋疼的程序
  1. int main(int argc,char* argv[])
  2. {
  3.     const int a = 1;
  4.     int b;
  5.     int *c;
  6.     b = (int)&a;
  7.     c = (int *)b;
  8.     *c = 2;

  9.     cout << &a << " " << c << endl;
  10.     cout << a << " " << *c << endl;

  11.     return 0;
  12. }
复制代码
用c-free写的,mingw5编译器,64位win7系统,运行结果为
0x28ff44 0x28ff44
1 2
神奇的事情出现了,同一个地址冒出了两个不同的数据

然后考虑到变量储存和作用域的情况,尝试着把变量挪到main外面,成为全局变量,然后发现,无论是把a还是c放到main外面,程序运行时都会直接出错,无法像上面这样进行操作


目前在和同学讨论中,暂时没有明确的思路,不知可否有大神来帮我们解惑

北大侠客行MUD,中国最好的MUD

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2013-6-8 17:16:40 | 显示全部楼层
已破。调试显示a的值的确被改成了2
然后找到了一个“常量折叠”的概念,编译器在编译时,已经把a的值直接计算出来,然后存入常量表了。所以直接调用a时,符号表里a对对应的是一个常量,所以就没进行变量读取操作,直接跑常量表里把1给找出来了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-6-9 08:13:51 | 显示全部楼层
改const的值,你这是要逆天?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2013-6-9 11:00:52 | 显示全部楼层
改const的值,你这是要逆天?
taolanlan 发表于 2013-6-9 08:13



    闲的蛋疼么。。。前两天才刚在类外面把对象的私有成员给改了。。。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-6-9 11:02:43 | 显示全部楼层
const只是编译时编译器做的检验,运行时是无法控制的。
理论上甚至可以在运行时修改加载到内存的代码。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2013-6-9 11:43:50 | 显示全部楼层
const只是编译时编译器做的检验,运行时是无法控制的。
理论上甚至可以在运行时修改加载到内存的代码。
hithit 发表于 2013-6-9 11:02



    但是只要把const放到全局里,或者把c*放到全局里,运行时都无法修改了,这点尤其诡异
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-6-9 12:05:47 | 显示全部楼层
不诡异,编译器有自己的优化模式,凡不在规范中注明的,均不能正式使用。作为理解编译器行为而作一些研究是有意义的,如果过于深究就是走偏了。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2013-6-9 13:22:55 | 显示全部楼层
本帖最后由 zgbl 于 2013-6-9 01:24 PM 编辑
不诡异,编译器有自己的优化模式,凡不在规范中注明的,均不能正式使用。作为理解编译器行为而作一些研究是 ...
hithit 发表于 2013-6-9 12:05



    哈哈,不深究,就是闹着玩
另外这个代码还用了个小花招,如果直接玩c = &a,是不能编译通过的,编译器会认为你用指针对const进行操作了。所以我绕了一步,把&a转成int存在b里,在把b的int转成地址给c,就搞定了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-6-9 21:05:42 | 显示全部楼层
你有空可以做以下事情:
1,多看协议,如SPI、I2C、UART、USB,要到能从波形图看出协议是否正确的程度
2,多看Linux内核代码,最好是开发板的
3,有空看下Android Framework

这些都是能赚钱的玩意。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2013-6-9 21:16:34 | 显示全部楼层
你有空可以做以下事情:
1,多看协议,如SPI、I2C、UART、USB,要到能从波形图看出协议是否正确的程度
2, ...
hithit 发表于 2013-6-9 21:05



    受教咯
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 10:44 PM , Processed in 0.013437 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表