读书人

关于骗过编译器改变const值的有关问题

发布时间: 2013-06-26 14:29:32 作者: rapoo

关于骗过编译器改变const值的问题
今天接触到const定义的值可以被改变的问题,具体讲到了虚拟地址,以及怎么编译的,还有涉及到了内存分配的问题。。。新手上路,实在有些东西吸收不了,希望来个大神给我们这些新手解释解释
[解决办法]
#include <stdio.h>
int main()
{
const int a=100;
int *c=(int*)&a;
*c=123;
printf("%d",a);
return 1;
}
[解决办法]
我前两天也才问过这个问题,楼主看看有没有帮助。

http://bbs.csdn.net/topics/390462962

实际上也不是用,就是一种喜欢钻研问题的精神,就像小时候看到玩具总想拆开看看里面是什么。

现在也一样,学了点汇编后总想看看这是什么,那是什么,可不可以这么实现,那样实现这样。
为什么这样会出错,为什么编译器诓人,不诓人时有什么规律这样。
[解决办法]

引用:
#include <stdio.h>
int main()
{
const int a=100;
int *c=(int*)&a;
*c=123;
printf("%d",a);
return 1;
}


这个写法,骗不过开了优化选项的编译器的,可以自己试试g++ -O3编译,本来const就是一个指示,而且同时没有volatile指示的话,编译器可以认为你是要输出100,于是给你自作主张优化掉,而且这个自作主张很有理由:正常的程序不会改const。


[解决办法]
还有一种可能是编译器把这种const放在只读数据段,那程序就要出运行时错误了,内存访问非法
老式有的编译器就是这么做的吧

读书人网 >C语言

热点推荐