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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑白世界 中级黑马   /  2015-9-22 10:31  /  777 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们知道C语言的字符串很变态,是一个字符数组,而且字符串的最后默认以‘\0’结尾,如果我们不以'\0'结尾会怎样呢?我们看一看:
  1. char s1[3]="abc";
  2. char s2[3]="def";
  3. printf("%s",s1);
  4. printf("%s",s2);
复制代码

在以上代码中,字符串s1和s2都定义为3个长度,但是赋值的字符串都是3个长度,这样做的结果就是s1和s2都被赋值的字符串沾满了,都没有以'\0'结尾。
那输出结果呢?
printf("%s",s1);  输出: abc
printf("%s",s2);  输出:defabc

我们现在通过内存分析来解释一下这个问题,如下为这两个字符串的内存分析(渣渣图示请自行脑补):
    s2  [0]  |___d___|
    s2  [1]  |___e___|
    s2  [2]  |___f____|
    s1  [0]  |___a___|
    s1  [1]  |___b___|
    s1  [2]  |___c___|
当用%s占位符输出时,会把传入的变量当做字符串处理(可以传入一个char变量实验一下)。输出时会一直读取到第一个'\0'出现才会停止,当输出
s1时,s1是先定义的变量,先定义的地址大,所以在后边,读取abc之后没有再可以输出的了,则输出了abc。
当输出s2时,先读取了def,但是没有读取到'\0'结尾标志,所以继续读取了s1的内存。

由上可知,当定义一个字符串变量时,正确的定义是多么重要,如果出现了以上的情况,在大型的程序中,最后输出一个什么玩意就没有现在这么简单了。
最后,再说一句字符串长度的函数,strlen()。这个函数的原理也是从字符串的第一个字符开始,直到读取到第一个'\0'结束。所以和printf()输出字符串是一个道理啦 。


4 个回复

倒序浏览
之前的C语言感觉难,学了OC之后我就觉得C语言的挺简单..OC算是给我难住了这考试我就忐忑了
回复 使用道具 举报
虽然strlen()是读取到"\0",但它返回的长度不包含"\0"
回复 使用道具 举报
从楼主的意思上是想根据字符串长度来动态定义数组,但是c99之前数组是不能动态定义的,数组大小必须是一个常量,一个在堆上的动态数组只能使用指针来定义
列如 一个用于存储N个整数的数组 可以这样写
int *parray = (int*) malloc(N*sizeof(int))
回复 使用道具 举报
感觉c还是挺有意思的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马