Posted on 2009-04-06 17:02
S.l.e!ep.¢% 閱讀(369)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
WinDbg
問(wèn)題內(nèi)容:為什么動(dòng)態(tài)修改vc2005的初如化字符串會(huì)出錯(cuò)?如何解決?
原討論鏈接:http://community.csdn.net/expert/topicview1.asp?id=5062781所屬論壇:基礎(chǔ)類 ? ? 審核組:VC/MFC提問(wèn)者:lovev8 ? ? 解決者:qtext感謝:關(guān)鍵字:VC/MFC基礎(chǔ)類vc2005初始化字符串,修改,異常答案:如果你以前經(jīng)常用vc6.0,你肯定會(huì)認(rèn)為下面的程序運(yùn)行時(shí)不會(huì)出錯(cuò)。
#include?<iostream.h>
int?main()
{
char*?pp="computer";
pp[0]='C';
cout<<pp;
return?0;
}
確實(shí),上面的程序用vc6.0?和bcb5.0?編譯,運(yùn)行都良好,不會(huì)出錯(cuò),正確顯示
Computer
但是,用vc2005?編譯此程序,運(yùn)行時(shí)卻出現(xiàn)異常,無(wú)法輸出正確的結(jié)果。
最初很是不解,通過(guò)察看編譯后的匯編代碼,終于找到答案。
原來(lái),vc2005不再象vc6.0那樣,將初始化字符串存放在_DATA數(shù)據(jù)段中,而是存放在
CONST段中,而CONST段具有只讀屬性,修改其中數(shù)據(jù)就會(huì)引發(fā)異常。這是上述程序不能在
vc2005環(huán)境下正常運(yùn)行的根本原因。
那么,這個(gè)問(wèn)題在vc2005下如何解決呢?
1)?加入一句編譯指令,#pragma?data_seg("mydata")??
2)?Release版本,禁止優(yōu)化,即用/Od,Debug版本?將/ZI?改為?/Zi?(注意大小寫)
(當(dāng)然,用命令行方式,更簡(jiǎn)單,不用作上面設(shè)置,即
cl?file.cpp
)
#include?<iostream.h>
#pragma?data_seg("mydata")??//加入這一句
int?main()
{
char*?pp="computer";
pp[0]='C';
cout<<pp;
return?0;
}
加入的這一句指示編譯器,將字符串放入名為mydata的數(shù)據(jù)段中,而數(shù)據(jù)段具有可讀、可寫屬性,
所以加上這一句后,程序在vc2005下可正常運(yùn)行。