字符串处理时刻提醒自己要在末尾手动加'\0'
2015-08-21 11:36
253 查看
话不多说,大家都明白字符串是以'\0'为结尾的,但偏偏今天编程序的时候忘了添加'\0'了,结果浪费时间调试一番才发现,囧死了。
先通过一段代码看看,忘记加'\0'会造成哪些难以发现的麻烦吧
运行结果:16,4
1、明明给p分配了两个字节strlen(p)为啥变成16了呢?别急,我们进入strlen()函数内部看一下。
原来strlen()是根据'\0'来判断是否到字符串末尾的,而且不管是否已经越界,而程序运行的时候恰巧在p指针后的第16(这个根据不同情况是个随机值)个字节有个0,所以就认为是16了。
2、为啥sizeof(p)是4呢?这个不必多说了吧,p是指针,sizeof指针是固定值4(64bit系统中是8),不明白请看我之前专门写的一篇关于sizeof的博客
3、既然用sizeof和strlen方法都看不出来究竟给p分配了多少字节,那单步调试总可以看出来吧?答案是否定的,我们看一下
![](http://images0.cnblogs.com/blog2015/652582/201508/211134226915916.png)
总之,编程中遇到字符串一定要记着在末尾手动加上'\0'!!!!切记,切记。
先通过一段代码看看,忘记加'\0'会造成哪些难以发现的麻烦吧
#include<iostream> #include<string> using namespace std; int main() { char *p; char *q="ab"; p=new char[2]; cout<<strlen(p)<<endl; cout<<sizeof(p); return 0; }
运行结果: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分配了多少字节,那单步调试总可以看出来吧?答案是否定的,我们看一下
![](http://images0.cnblogs.com/blog2015/652582/201508/211134226915916.png)
总之,编程中遇到字符串一定要记着在末尾手动加上'\0'!!!!切记,切记。
相关文章推荐
- 编写高质量代码改善C#程序的157个建议——建议103:区分组合和继承的应用场合
- S5PV210的IRAM应用
- JNI学习2——jni入门篇
- LayoutInflater 详解
- 移动端技术简单分析
- svn使用记录
- 移动端技术简单分析
- 无USB下如何实现PC电脑与手机无线连接
- [leetcode] 236.Lowest Common Ancestor of a Binary Tree
- 从request中获取上一个请求的url
- Gauss消去法求线性方程组
- Codeforces Round #152 (Div. 2) D. Sweets for Everyone!(二分)
- 洛谷1003 铺地毯 解题报告
- 无重复元素的排列
- HDOJ 1599 find the mincost route(floyd 最小环,模板)
- 随遇而安来自心甘情愿
- androoid makefile 学习
- 【SpringMVC整合MyBatis】提供学习参考的项目源码
- IE6 、IE7 、 IE8 的 CSS 、 JS 兼容
- JPA 继承方式