C中的字符数组和字符串终止字符



我知道在C中,终止字符串。我们可以将字符串和字符数组都分配给字符数组吗?

char c1[] = "hello";
char c2[] = {'h','e','l','l','o'};

然而,我意识到字符数组并没有作为终止字符:

printf("%dn",sizeof(c1));  //6
printf("%dn",sizeof(c2));  //5

然而,当我打印它们时,我会看到这样的东西:

printf("%sn",c1); //hello
printf("%sn",c2); //helloV

Q1.如果我重新运行它,第二行有时会打印helloU,有时会打印出helloV。为什么会这样?

Q2.还有,字符数组可以包含终止字符串,也可以不包含终止字符数组,这是怎么回事?

Q3.我知道printf在遇到时终止。当printf没有遇到时,它的行为如何?

代码

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

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

想想这个简单的例子:

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

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

最新更新