S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
问题内容:为什么动态修改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下可正常运行。


  • 只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理