boiz 的C++ 备忘录(三)-- 注意strcpy函数的一个陷阱

在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] --- > (空串)

是什么原因大家应该一目了然了吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值