我们知道C语言的字符串很变态,是一个字符数组,而且字符串的最后默认以‘\0’结尾,如果我们不以'\0'结尾会怎样呢?我们看一看:
- char s1[3]="abc";
- char s2[3]="def";
- printf("%s",s1);
- 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()输出字符串是一个道理啦 。
|
|