任何人都知道为什么printf在输出时连接这两个变量,但只有在没有指定字符串的长度时?
#include <stdio.h>
int main(){
char myname[3] = "tim";
char myage[3] = "ten";
printf("myname is:%s \n", myname);
printf("myage is:%s \n", myage);
}
Run Code Online (Sandbox Code Playgroud)
我的名字是:蒂姆
myage是:tentim
...但是当我没有指定字符串的长度时,它似乎按照我的预期工作,而不打印两个变量.
#include <stdio.h>
int main(){
char myname[] = "tim";
char myage[] = "ten";
printf("myname is:%s \n", myname);
printf("myage is:%s \n", myage);
}
Run Code Online (Sandbox Code Playgroud)
我的名字是:蒂姆
myage是:十
您声明数组具有大小,3但您尝试在其中存储4元素.由于只有3元素有足够的内存,因此最后一个元素(字符串空终止符\0)没有剩余内存,这会使您的字符数组不带空终止符.
请注意,c中的字符数组应该以null结尾,以便您可以使用它们进行打印printf.这是因为printf只需遍历字符数组直到遇到a \0.在你的第一个例子中,因为数组从未被\0终止,你最终得到的是未定义的行为.(实际上,pintf将继续打印,直到遇到a \0并且在进程中读取超出分配给数组的内存范围)
在第二种情况下,由于您没有自己指定大小,因此根据字符串中指定的元素数量选择合适的大小,即:4并且\0终止就位.