分享
 
 
 

深入探讨常量、指向常量的指针,常量与变量的区别

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

今天在csdn c区看到飞翔网友一个提问帖,虽然很简单但感觉挺有意义的:

-------------------------------------------------------------------------------------------------------------------------

我在VC中编程时,写了这样两句代码。

char * q = "Hello";

*q = 'W';

编译没有错误。当运行到第二句时,总会提示这样的错误:

Unhandled exception in GeneralTest.ext: 0xC0000005: Access Violation.

请问这是为何?

按理讲,我只是通过指针更改其所指内存中的指而以,怎么会出错呢?怎么又总是在0xC0000005处出错呢?

--------------------------------------------------------------------------------------------

我在此将各位前辈对此问题的解答进行系统的整理。

此问题代码中,"Hello"是一个常量,由于c/c++定义中常量是不能被修改的。所以尽管飞翔将存储常量的地址赋给了一个指针,指针可以获得这个常量的值,但是对它进行修改却是非法的。

根据c/c++语法,当你声明该量为常量,即告诉程序和编译器,你不希望此量被修改。

程序的实现,为了保护常量,特将常量都放在受保护的静态存储区内。凡是试图修改这个区域内的值,都将被视为非法,并报错。

这不能理解为凡是字符串都是放在静态存储区域的。这个跟数据类型没有关系,而是这个量是变量还是常量的问题。例如,一个字符串变量就是可以被修改的。

这种静态存储区域的保护机制是由编译器实现的,而非存储该值的内存的电器属性。换言之,实质上内存永远都可以被用户随意修改,只是编译器给用户的代码注入了一些自己的保护代码,通过软件手段将这段内存软保护起来。这种保护在汇编级别可以轻松突破,其保护也就无效了。

vc6的debug模式编译结果给程序添加了这样的保护,帮助用户尽早发现程序错误,而非此保护不可或缺。而release模式下对程序针对运行效率进行了优化,这样的保护显然是要消耗系统资源的,不利于提高效率。而且编译器假定,一个要发布的想要在release模式下编译的程序必然经过了debug模式的调试,已经处理了这样的错误。所以此时在审查就是冗余的了,vc6的release模式下放弃了对常量的保护。因此如果你的代码没有经过debug模式的编译而直接release,就没有人去检查你是否修改了常量,也没有人去禁止这个操作。

这并非说release模式下承认对常量修改的合法性,仅仅是不去管理罢了。vc6的release模式下放弃了对常量的保护,但是其他的实现未必这样做,这要具体看你的实现环境了。

从本质上说,对于机器,对于硬件是不存在常量与变量的区别的。它们都是内存中被分配了的一段内存空间罢了。甚至不存在数据类型上的区别。对所有的数据来说,内存都是一样的。数据之间的相互区别也是通过存在内存中的数据实现的。

对于这方面,学习过汇编的朋友会比较清楚。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有