冷夜 C++ 小栈

关于C++的一些经验与心得,还会有一些技术文摘

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  6 Posts :: 5 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(10)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

在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 )

posted on 2005-09-12 23:32 冷夜 阅读(366) 评论(0)  编辑 收藏 引用 所属分类: C++ 经验与技巧

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