-
问题内容:为什么动态修改vc2005的初如化字符串会出错?如何解决?
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5062781
- 所属论坛:基础类
审核组:VC/MFC
- 提问者:lovev8
解决者:qtext
- 感谢:
- 关键字:VC/MFC 基础类 vc2005 初始化字符串,修改,异常
- 答案:
如果你以前经常用vc6.0,你肯定会认为下面的程序运行时不会出错。
#include <iostream.h>
int main()
{
char* pp="computer";
pp[0]='C';
cout<<pp;
return 0;
}
确实,上面的程序用vc6.0 和bcb5.0 编译,运行都良好,不会出错,正确显示
Computer
但是,用vc2005 编译此程序,运行时却出现异常,无法输出正确的结果。
最初很是不解,通过察看编译后的汇编代码,终于找到答案。
原来,vc2005不再象vc6.0那样,将初始化字符串存放在_DATA数据段中,而是存放在
CONST段中,而CONST段具有只读属性,修改其中数据就会引发异常。这是上述程序不能在
vc2005环境下正常运行的根本原因。
那么,这个问题在vc2005下如何解决呢?
1) 加入一句编译指令,#pragma data_seg("mydata")
2) Release版本,禁止优化,即用/Od,Debug版本 将/ZI 改为 /Zi (注意大小写)
(当然,用命令行方式,更简单,不用作上面设置,即
cl file.cpp
)
#include <iostream.h>
#pragma data_seg("mydata") //加入这一句
int main()
{
char* pp="computer";
pp[0]='C';
cout<<pp;
return 0;
}
加入的这一句指示编译器,将字符串放入名为mydata的数据段中,而数据段具有可读、可写属性,
所以加上这一句后,程序在vc2005下可正常运行。
- 评价:
给朵鲜花(31)
扔个鸡蛋(11)