C风格字符串动态分配和撤销内存报错的问题

来源:互联网 发布:查看环境变量 linux 编辑:程序博客网 时间:2024/06/10 22:48
Definition:C风格字符串即是以‘\0’结尾的字符串(非string类型)。其生成方式有如下3种:
  1.   char A[10]={'a','b','\0'};//显式定义
  2.   char A[10]="ab";//隐式添加‘\0'定义
  3.   char *A="ab";//隐式添加‘\0'定义

从上面可以看出,C风格字符串定义有基于字符数组(1和2)和基于字符指针(3)两种定义方式。

基于数组定义不易出错,只是像1中定义过程过于麻烦,推荐用2的方式定义;而基于字符指针同样可以定义C风格字符串,像3中定义方式也不会有问题,但是,假如事先不知道要输入什么字符串,则需要对字符指针动态分配内存,这样在撤销内存时你就很可能会遇到如下问题了


  char * B=new char; //可以输入字符串并输出,但实际上是越界的。delete B;会报错!

  char * B=new char[2];//只能输入长为1个字符的字符串。如果输入长字符串也同样可以输出,但实际上越界, delete [] B;会报错!


这里要记住cin>>B;时输入的是一个C风格字符串,会自动多添加一个‘\0’字符结尾,这样保证你在cout<<B; 时可以得到正确字符串。所以字符串占内存长度为“输入字符串的长度+1”,如果这个长度大于你new给它的指针分配的内存,在delete[]撤销时便会报错。


所以,即使如char *B=new char; 这句只输入给B一个字符,delete B; 也会报错,因为多了'\0'占内存长度为2,越界!

0 0