Linux C之奇妙的字符串世界
来源:互联网 发布:c语言判断奇偶性函数 编辑:程序博客网 时间:2024/04/19 22:20
“这就是字符串,说也说不清楚,这就是字符串,稀里又糊涂”“ --刘欢这样评价字符串
开个玩笑,不然刘老师看到了非要批评才怪呢,呵呵
有疑问才能激发兴趣,果断先上问题,请问大家,加上注释掉的那一行和不加那一行的结果分别为什么呢?
请先好好思考下这个问题,然后再去看答案,这会让你有更多的可学的东西的
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 char s[] = "123456789"; 7 char d[] = "123"; 8 strcpy(d,s); //此行即为注释或者不注释的代码 9 printf("%s\n%s\n",d,s); 10 printf("%d %d\n",strlen(d),strlen(s)); 11 return 0; 12 }思考的如何了,好了,先看结果,直接上答案
加注释的结果为:
123
123456789
3 9
大家一定会说,这就是普通的嘛,是滴,就是这样,但是没有普通的去对比,哪有特别的呢
不加注释的结果为:
123456789
56789
9 5
额,什么情况?吃着火锅唱着歌,突然字符串都变了,什么世道?
好了,现在我们要说说原因了
首先,第一点,我觉得应该是局部变量的存储问题了,这两个字符串都存储在栈上。(如果不清楚的朋友可以看下我的另一篇讲解字符串指针和字符数组的文章)
栈的空间是很宝贵的,也相对于堆来说要小很多,所以在栈上,这两个字符串是以这样的一种形式存储的
123\0123456789\0
我打印出了地址是这样的:s的地址0xbfc88ff6 d的地址0xbfc88ff2
然后当我们执行了strcpy之后空间就变成这样了
123456789\06789\0
我们知道,一个字符串结束的标志就是'\0',所以打印的结果就是你看到的那样了。
代码在Linux环境下C99标准下gcc (GCC) 4.4.4 20100726 (Red Hat 4.4.4-13)下测试通过
希望大家可以批评指正,如果有好的意见和补充的地方请留言,不胜感激。
- Linux C之奇妙的字符串世界
- 奇妙的网络世界
- 奇妙的“秒”世界
- 计算世界的奇妙探险
- 探究Linux的奇妙之旅
- 奇妙的字符串
- 欢迎来到Ubuntu的奇妙世界
- 尝试的奇妙之处
- EXT的奇妙之旅
- 奇妙的三子棋之旅
- ++运算的奇妙之处
- table的奇妙之处
- 世界真奇妙
- Linux高级网络开发奇妙之旅
- Linux高级网络开发奇妙之旅
- C中莫名奇妙的BUG
- 悟透JavaScript之奇妙的对象
- Linux之父眼中的世界
- CONST用法小结
- windows下打印机相关操作
- Oracle的优化器(Optimizer) (CBO优化) 分享
- cocos2d飞机弹幕demo
- flashback_transaction_query
- Linux C之奇妙的字符串世界
- Merge
- oracle 查询表 的数据类型
- struts2 学习笔记
- an excellent book
- Trigger example
- sql和PL/SQL中绑定变量的区别
- OPNET 错误记录及解决方法
- oracle_datapump类型外部表