我知道在C中,\0
终止字符串。
我们可以将字符串和字符数组都分配给字符数组吗?
char c1[] = "hello";
char c2[] = {'h','e','l','l','o'};
但是,我意识到字符数组没有\0
作为终止字符:
printf("%d\n",sizeof(c1)); //6
printf("%d\n",sizeof(c2)); //5
但是,当我打印它们时,我看到的是这样的:
printf("%s\n",c1); //hello
printf("%s\n",c2); //helloV
Q1。如果我重新运行它,第二行有时会打印helloU
,有时会打印helloV
。为什么会这样?
Q2。同样可以确定字符数组可以包含\0
终止字符串,而不能包含\0
终止字符数组吗?
Q3。我知道printf
在遇到\0
时终止。 printf
在未遇到\0
时的行为如何?
答案 0 :(得分:1)
c2
不是字符串,因此将其传递到printf
%s
具有未定义的行为。未定义的行为是未定义的。从技术上讲,不需要打印任何内容。它还可能会删除您的所有文件,或者进入无限循环或... 答案 1 :(得分:1)
printf
在遇到\0
时停止读取内存。在您使用c2
的示例中,您不知道printf
何时停止读取,因为您不知道下一个\0
在内存中的位置。 printf
确实在读取随机存储器,这解释了为什么您无法预测屏幕上将要打印的内容。最终,您可能会开始读取不属于您的程序的内存。如果发生这种情况,大多数操作系统将立即终止您的程序。
考虑这个简单的例子:
int a;
printf("%d", a);
您无法预测a
所包含的内容,因此无法预测将在屏幕上显示的内容。在您的示例中发生了完全相同的事情,您不知道第二个数组中'o'
之后是什么。