在CSDN论坛的VC板块看到有人问如下问题,不禁使我想起以前遇到过一个类是的BUG,因此觉得有必要写下来,以免久了就忘了。
下面先看问题:
////bowex ()///////////////////////////////////////////////////////
char uu[3][2];
CString s;
for(int i=0;i<3;i++)
{
s="我";
strcpy(uu[i],s);
}
运行完以上程序后为何数组uu中的内容是
uu[0] --- > 我我我
uu[1] --- > 我我
uu[2] --- > 我
而不是
uu[0] --- > 我
uu[1] --- > 我
uu[2] --- > 我 为何? 奇怪! 多谢
////////////////////////////////////////////////////////////////////
网友“QunKangLi(维护成本与程序员的创造力的平方成正比)”给出解释:
“char uu[3][3];//这样就行了,字符串结束符占一个字符宽度。”
这个解释是很对,不过我还是要强调一下这种情况可能产生的严重后果:
像这种情况让我想起了strcpy函数可能引起非法内存访问,也就是说,如果
strcpy拷贝的目的地址分配的空间不够,那么strcpy会把空间后面的地址也占用,
这样就可能使某些数据被意外修改,从而导致程序崩溃或者数据异常。之所以有
这种感受,是因为以前碰到有个程序,就发生这样的错误,就是因为strcpy拷贝的内容
过长从而把数据结构中紧接其后的成员的数据变为0了,结果程序当然出现意外。
假设把上面的for循环用下面的语句代替 那么结果就更加荒唐, 因为会出现乱码。
char uu[3][2];
CString s;
s="我";
strcpy(uu[2],s);
strcpy(uu[1],s);
strcpy(uu[0],s);
大家可以编译一下上面的代码,运行程序 你可以看到uu数组中有乱码。
如果输出的话,应该是这样的,
uu[0] --- > 我
uu[1] --- > (空串)
uu[2] --- > (空串)
是什么原因大家应该一目了然了吧。
(本文是本人以baodi_z的网名原发表在CSDN的个人BLOG,原文发表于 2005年03月21日 6:23 PM )