C

时间:2018-12-03 17:23:47

标签: c arrays string printf

我知道在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时的行为如何?

Code

2 个答案:

答案 0 :(得分:1)

  1. c2不是字符串,因此将其传递到printf %s具有未定义的行为。未定义的行为是未定义的。从技术上讲,不需要打印任何内容。它还可能会删除您的所有文件,或者进入无限循环或...
  2. 并非所有字符数组都是字符串。只要不将其传递给需要字符串的函数,就可以将所需的任何内容存储在字符数组中。
  3. 它具有未定义的行为。

答案 1 :(得分:1)

printf在遇到\0时停止读取内存。在您使用c2的示例中,您不知道printf何时停止读取,因为您不知道下一个\0在内存中的位置。 printf确实在读取随机存储器,这解释了为什么您无法预测屏幕上将要打印的内容。最终,您可能会开始读取不属于您的程序的内存。如果发生这种情况,大多数操作系统将立即终止您的程序。

考虑这个简单的例子:

int a;
printf("%d", a);

您无法预测a所包含的内容,因此无法预测将在屏幕上显示的内容。在您的示例中发生了完全相同的事情,您不知道第二个数组中'o'之后是什么。