标签:
话不多说,大家都明白字符串是以‘\0‘为结尾的,但偏偏今天编程序的时候忘了添加‘\0‘了,结果浪费时间调试一番才发现,囧死了。
先通过一段代码看看,忘记加‘\0‘会造成哪些难以发现的麻烦吧
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 char *p; 7 char *q="ab"; 8 p=new char[2]; 9 cout<<strlen(p)<<endl; 10 cout<<sizeof(p); 11 return 0; 12 }
运行结果:16,4
1、明明给p分配了两个字节strlen(p)为啥变成16了呢?别急,我们进入strlen()函数内部看一下。
int strlen (const char * str) { int length = 0; while( *str++ ) ++length; return( length ); }
原来strlen()是根据‘\0‘来判断是否到字符串末尾的,而且不管是否已经越界,而程序运行的时候恰巧在p指针后的第16(这个根据不同情况是个随机值)个字节有个0,所以就认为是16了。
2、为啥sizeof(p)是4呢?这个不必多说了吧,p是指针,sizeof指针是固定值4(64bit系统中是8),不明白请看我之前专门写的一篇关于sizeof的博客
3、既然用sizeof和strlen方法都看不出来究竟给p分配了多少字节,那单步调试总可以看出来吧?答案是否定的,我们看一下
总之,编程中遇到字符串一定要记着在末尾手动加上‘\0‘!!!!切记,切记。
标签:
原文地址:http://www.cnblogs.com/bewolf/p/4747396.html