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