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)下测试通过
希望大家可以批评指正,如果有好的意见和补充的地方请留言,不胜感激。


原创粉丝点击