关于strlen和strcpy的一点问题

 很简单的一段程序

#include <iostream.h>
#include <string.h>

void main() {
  char *s = "test buffer";
  int length = strlen(s);
  char *testbuf = new char[length+1];
  strcpy(testbuf,s);
  delete []testbuf;
  cout<<"delete finished"<<endl;
}

从别处看来的,起初是奇怪为什么要 new char[length+1],为什么要length+1呢,直接length不行吗?

试试...

不行,果然不行,非要length+1,不加就会弹出异常对话框。

苦恼哦,偶比较笨,刚开始以为问题出在new和delete上,也的确是执行到delete语句出错,后来愣是查了一个小时才知道原因,还不知确切不。

从MSDN查得,strlen是“Each of these functions returns the number of characters in string, excluding the terminal NULL”,也就是说字符串中有多少个字符,它就返回多少个字符的长度,并不包括结束符。

而strcpy则是“The strcpy function copies strSource, including the terminating null character, to the location specified by strDestination.”,并且“No overflow checking is performed when strings are copied or appended”,即strcpy将字符串结束符也copy,并且不进行溢出检查。

所以  strcpy(testbuf.s)之后,testbuf中不仅有“test buffer”,还有结束符,长度已经不是 length,而是length+1咯。

并且由于strcpy不进行溢出检查,所以该语句并未出现异常,但当 delete []testbuf时,因为要delete的内存块大于new的内存块大小不同,所以就出现异常啦!

如果  new char[length+n]  //n>=1,这样就不会出现异常,也就是说只要new 的内存大于 delete的内存,就不会出现异常。

偶是笨人,不知所述对否,哪位看到如果有错,欢迎指教,呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值