黑马程序员技术交流社区

标题: 变量在内存中存储问题 [打印本页]

作者: 傘が咲く    时间: 2014-4-20 15:45
标题: 变量在内存中存储问题
本帖最后由 傘が咲く 于 2014-4-22 16:59 编辑
  1. #include <stdio.h>

  2. test()
  3. {
  4.         char s1[] = {'l','q','\0'};
  5.         char s2[] = {'i','o','s'};
  6.         printf("%s\n",s2);//为什么s2定义在s1的后面,而打印的时候,找不到'\0'会去前面定义的字符串找,在内存中这些数据是以何顺序存储的?
  7. }

  8. int main()
  9. {
  10.         test();
  11.         return 0;
  12. }
复制代码

求正解{:3_46:}{:3_46:}
作者: m573555543    时间: 2014-4-20 16:00
本帖最后由 m573555543 于 2014-4-20 16:03 编辑

这个是我笔记上记载的。如果还有不懂得地方可以看下视频\复杂数据类型\02-字符串

要搞清楚为什么,首先要看看a和b的内存地址:

printf("a的地址:%x", a);
printf("\n");
printf("b的地址:%x", b);
输出结果: ,由这个数据我们可以分析出a和b的内存存储情况如下:



可以看出来,数组b和a的内存地址是连续的。我们再回到输出b的代码:

printf("字符串b:%s", b); // 输出字符串b
%s表示期望输出一个字符串,因此printf函数会从b的首地址开始按顺序输出字符,一直到\0字符为止,因为\0是字符串的结束标记。

所以,如果想要创建一个字符串,记得加上结束符\0,不然后果很严重,会访问到一些垃圾数据。



作者: 杨勇    时间: 2014-4-20 16:00

这是模拟的内存,因为内存在寻址的时候,是从大到小的。字符数组s1[]先定义,所以它的地址更大。希望能够解决你的问题。

作者: 星河鹭起    时间: 2014-4-20 16:50
首先关于变量的寻址,是从地址大的到地址小的,因此s1的地址会比s2的地址大,然后在打印字符串的时候,遇到\0就会停止打印,因为S2一直没有\0,所以一直会将s1打印出来,就像楼上的截图。
作者: 戴文婷    时间: 2014-4-21 17:05
  1. char s1[] = {'l','q','\0'};
  2.         char s2[] = {'i','o','s'};
复制代码

是以栈的方式存储的,也就是先进后出。

先读到s1 放在栈的最底部。
然后再读到s2放在s1的上面。 图按楼上的看就明白了~


作者: 傘が咲く    时间: 2014-4-21 23:32
戴文婷 发表于 2014-4-21 17:05
是以栈的方式存储的,也就是先进后出。

先读到s1 放在栈的最底部。

恩,谢谢,我也觉得像是栈,原来不太确定:)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2