zgbl 发表于 2013-6-8 17:03:58

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

前几天一时兴起,想尝试着在类外面访问私有成员,然后通过指针操作地址的方式搞定了,顿时觉得指针这东西太不和谐了

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

    cout << &a << " " << c << endl;
    cout << a << " " << *c << endl;

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

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


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

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

zgbl 发表于 2013-6-8 17:16:40

已破。调试显示a的值的确被改成了2
然后找到了一个“常量折叠”的概念,编译器在编译时,已经把a的值直接计算出来,然后存入常量表了。所以直接调用a时,符号表里a对对应的是一个常量,所以就没进行变量读取操作,直接跑常量表里把1给找出来了

taolanlan 发表于 2013-6-9 08:13:51

改const的值,你这是要逆天?

zgbl 发表于 2013-6-9 11:00:52

改const的值,你这是要逆天?
taolanlan 发表于 2013-6-9 08:13 http://pkuxkx.com/forum/images/common/back.gif


    闲的蛋疼么。。。前两天才刚在类外面把对象的私有成员给改了。。。

hithit 发表于 2013-6-9 11:02:43

const只是编译时编译器做的检验,运行时是无法控制的。
理论上甚至可以在运行时修改加载到内存的代码。

zgbl 发表于 2013-6-9 11:43:50

const只是编译时编译器做的检验,运行时是无法控制的。
理论上甚至可以在运行时修改加载到内存的代码。
hithit 发表于 2013-6-9 11:02 http://pkuxkx.com/forum/images/common/back.gif


    但是只要把const放到全局里,或者把c*放到全局里,运行时都无法修改了,这点尤其诡异

hithit 发表于 2013-6-9 12:05:47

不诡异,编译器有自己的优化模式,凡不在规范中注明的,均不能正式使用。作为理解编译器行为而作一些研究是有意义的,如果过于深究就是走偏了。

zgbl 发表于 2013-6-9 13:22:55

本帖最后由 zgbl 于 2013-6-9 01:24 PM 编辑

不诡异,编译器有自己的优化模式,凡不在规范中注明的,均不能正式使用。作为理解编译器行为而作一些研究是 ...
hithit 发表于 2013-6-9 12:05 http://pkuxkx.com/forum/images/common/back.gif


    哈哈,不深究,就是闹着玩
另外这个代码还用了个小花招,如果直接玩c = &a,是不能编译通过的,编译器会认为你用指针对const进行操作了。所以我绕了一步,把&a转成int存在b里,在把b的int转成地址给c,就搞定了yct7

hithit 发表于 2013-6-9 21:05:42

你有空可以做以下事情:
1,多看协议,如SPI、I2C、UART、USB,要到能从波形图看出协议是否正确的程度
2,多看Linux内核代码,最好是开发板的
3,有空看下Android Framework

这些都是能赚钱的玩意。

zgbl 发表于 2013-6-9 21:16:34

你有空可以做以下事情:
1,多看协议,如SPI、I2C、UART、USB,要到能从波形图看出协议是否正确的程度
2, ...
hithit 发表于 2013-6-9 21:05 http://pkuxkx.com/forum/images/common/back.gif


    受教咯
页: [1]
查看完整版本: 【程序员进】关于c++中同一地址存在多个数值的问题