A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傘が咲く 高级黑马   /  2014-4-20 15:45  /  1253 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 傘が咲く 于 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:}

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 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,不然后果很严重,会访问到一些垃圾数据。


评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报

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

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报 1 0
首先关于变量的寻址,是从地址大的到地址小的,因此s1的地址会比s2的地址大,然后在打印字符串的时候,遇到\0就会停止打印,因为S2一直没有\0,所以一直会将s1打印出来,就像楼上的截图。
回复 使用道具 举报
  1. char s1[] = {'l','q','\0'};
  2.         char s2[] = {'i','o','s'};
复制代码

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

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

回复 使用道具 举报
戴文婷 发表于 2014-4-21 17:05
是以栈的方式存储的,也就是先进后出。

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

恩,谢谢,我也觉得像是栈,原来不太确定:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马