在CSDN論壇的VC板塊看到有人問如下問題,不禁使我想起以前遇到過一個(gè)類是的BUG,因此覺得有必要寫下來,以免久了就忘了。
下面先看問題:
////bowex ()///////////////////////////////////////////////////////
char uu[3][2];
CString s;
for(int i=0;i<3;i++)
{
s="我";
strcpy(uu[i],s);
}
運(yùn)行完以上程序后為何數(shù)組uu中的內(nèi)容是
uu[0] --- > 我我我
uu[1] --- > 我我
uu[2] --- > 我
而不是
uu[0] --- > 我
uu[1] --- > 我
uu[2] --- > 我 為何? 奇怪! 多謝
////////////////////////////////////////////////////////////////////
網(wǎng)友“QunKangLi(維護(hù)成本與程序員的創(chuàng)造力的平方成正比)”給出解釋:
“char uu[3][3];//這樣就行了,字符串結(jié)束符占一個(gè)字符寬度。”
這個(gè)解釋是很對,不過我還是要強(qiáng)調(diào)一下這種情況可能產(chǎn)生的嚴(yán)重后果:
像這種情況讓我想起了strcpy函數(shù)可能引起非法內(nèi)存訪問,也就是說,如果
strcpy拷貝的目的地址分配的空間不夠,那么strcpy會把空間后面的地址也占用,
這樣就可能使某些數(shù)據(jù)被意外修改,從而導(dǎo)致程序崩潰或者數(shù)據(jù)異常。之所以有
這種感受,是因?yàn)橐郧芭龅接袀€(gè)程序,就發(fā)生這樣的錯(cuò)誤,就是因?yàn)閟trcpy拷貝的內(nèi)容
過長從而把數(shù)據(jù)結(jié)構(gòu)中緊接其后的成員的數(shù)據(jù)變?yōu)?了,結(jié)果程序當(dāng)然出現(xiàn)意外。
假設(shè)把上面的for循環(huán)用下面的語句代替 那么結(jié)果就更加荒唐, 因?yàn)闀霈F(xiàn)亂碼。
char uu[3][2];
CString s;
s="我";
strcpy(uu[2],s);
strcpy(uu[1],s);
strcpy(uu[0],s);
大家可以編譯一下上面的代碼,運(yùn)行程序 你可以看到uu數(shù)組中有亂碼。
如果輸出的話,應(yīng)該是這樣的,
uu[0] --- > 我
uu[1] --- > (空串)
uu[2] --- > (空串)
是什么原因大家應(yīng)該一目了然了吧。
(本文是本人以baodi_z的網(wǎng)名原發(fā)表在CSDN的個(gè)人BLOG,原文發(fā)表于 2005年03月21日 6:23 PM )