const变量的存储区及修改权限
来源:互联网 发布:淘宝如何免费上传视频 编辑:程序博客网 时间:2024/06/06 12:47
blog.csdn.net/jcwkyl/article/details/4986067
最近突然想起hjbolide在论坛上发过的这篇帖子:http://www.jluopen.org/bbs/viewthread.php?tid=129
在帖子的最后,有这么一个很有趣的实验:
- const int a = 1;
- int *p = const_cast<int*>(&a);
- *p = 2;
- cout << “value a=”<< a << endl;
- cout << “value *p=” <<*p << endl;
- cout << “address a=” <<&a << endl;
- 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是告诉编译器不优化,而是到内存里取数据。
- const变量的存储区及修改权限
- const变量的存储区及修改权限
- 旧事重提——const变量的存储区及修改权限
- 旧事重提——const变量的存储区及修改权限
- const变量的存储方式
- 修改const修饰的变量
- const 变量的存储位置在哪儿?
- const变量真的不能修改吗?
- const 变量是如何被修改的
- C++中const变量的修改
- 修改C中const修饰的变量
- 【C++】修改const变量的值
- mutable 修改const修饰过的变量
- 可以被const函数修改的非const变量----mutabel
- 修改const变量
- 奇怪的函数内const变量。修改了变量对应内存区的值,但const变量值没有变化。
- const char * char * const strcpy 及数据存储区的总结
- 修改声明为const的变量的值
- Android游戏开发之Cocos2d-android-1 安装运行 (一)
- 13 View工作原理【消息类型与按键消息派发】
- hdu1530 Maximum Clique,最大团 , DP,邻接矩阵
- 链接服务器'(null)'的OLE DB访问接口'STREAM'返回了对列 '[!BulkInsert]
- linux 静态库、共享库
- const变量的存储区及修改权限
- AFNetworking了解
- 《黄鹤楼》 崔颢
- java基础02
- 简单的build.xml
- GPRS模块SIM9001发送短信(发送长短信),包括PDU和text两种模式
- Qt 调用外部exe的方法
- 关于字符串转换日期的问题
- 当迷茫在大学泛滥成灾