const变量的存储区及修改权限

来源:互联网 发布:淘宝如何免费上传视频 编辑:程序博客网 时间:2024/06/06 12:47


blog.csdn.net/jcwkyl/article/details/4986067


最近突然想起hjbolide在论坛上发过的这篇帖子:http://www.jluopen.org/bbs/viewthread.php?tid=129
在帖子的最后,有这么一个很有趣的实验:


[cpp] view plaincopy
  1.     const int a = 1;  
  2.     int *p = const_cast<int*>(&a);  
  3.     *p = 2;  
  4.     cout << “value a=”<< a << endl;  
  5.     cout << “value *p=” <<*p << endl;  
  6.     cout << “address a=” <<&a << endl;  
  7.     cout << “address p=” <<p << endl;  

const变量居然被合法的修改了!

const定义常量和define常量的区别

                (1)const相对define来说具有类型检查机制,define只是在预处理的时候简单的进行字符串替换而已,define相对来说太不安全了

                  (2)有一些编译器能够对const进行调试,而define不能够

这里说说我最近的想法:
                const变量有全局的和局部的,C语言中全局的const变量默认为外连接,所以默认都是有内存地址的,c++中全局的const变量默认为内连接,它可以被编译器放到符号表中作为编译期常量,所以在c中,const int k = 2; int a[k]是非法的,但在c++中是合法的。

             在c++中,全局const有时候也是需要分配内存的,在定义全局const数组是要分配内存,常量折叠也需要分配内存,同时在extern const也就是外部连接也要分配内存
             这是全局const变量,局部的const变量在C和C++中一视同仁,都是放在函数局部栈中的,把编译后的可执行文件在汇编级调试一下马上就能看出来。
这样,问题就很明了。在c和c++中,局部的const变量只是用来吓唬人的,想改它的值照样改,因为它存在于函数局部栈中,根本就不受任何权限的保护。当然修改的时候只要做个强制类型转化就好。
至于全局的const变量,C中默认是外连接,它有地址,有地址当然也能够被改掉,所以,你可以像在C语言中改变局部const变量那样通过指针来修改全局const的值,编译时没有任何问题,连个warning都没有,只不过在运行时,你会得到一个segmentationfault而已。为什么呢?因为全局的const变量是存放在只读数据段里的,它比函数局部栈里的那些const变量高级,它受到只读数据段的权限保护,所以,你试图修改一个只读数据段中的内容,会得到一个运行时错误。




volatile是告诉编译器不优化,而是到内存里取数据。

0 0
原创粉丝点击