Posted on 2009-04-06 17:02
S.l.e!ep.¢% 阅读(353)
评论(0) 编辑 收藏 引用 所属分类:
WinDbg
问题内容:为什么动态修改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下可正常运行。