为什么我们需要 C 中的终止字符

Zeq*_*ang 2 c arrays string termination

我是 C 编程语言的新手,最近几天在学习它。我对终止字符的工作原理以及我们为什么需要它并不感到困惑。当我查看网络上的一些文档时,他们通常会在我们初始化 char 数组时声明最后一个字符必须是 '\0'。但是,当我不将它插入到 char 数组的末尾时,它似乎也可以编译并且运行良好。例如:

char test[4] = "test";
printf("%s\n", test );
printf("%lu\n", strlen(test) );
Run Code Online (Sandbox Code Playgroud)

它编译,正确打印出值,并且 strlen 返回正确的值,这意味着编译器知道 char 数组中的最后一个字符在哪里。那为什么我们要在最后加上'\0'。这只是公约吗?或者还有其他事情?

谢谢。

gna*_*729 5

您明确地将 test 声明为一个包含四个字符的数组,因此它是一个包含四个字符的数组,包含“t”、“e”、“s”和“t”。

printf ("%s") 需要一个以零结尾的字符串,strlen 也是如此。您有一个包含四个字符的数组,不包含零,因此将其传递给 printf 或 strlen 是未定义的行为。

由于您的数组后跟未知字节,因此下一个字节为零可能纯属巧合。如果是这种情况,那么可能会打印“test”并且 strlen() 返回 4。但这纯粹是巧合。

也可能发生的是您的程序崩溃。或者它打印“testgarbagegarbagegarbage”并且 strlen 返回一些大数字。或者您的程序在您开发时按预期愉快地工作,并且在第一个付费客户使用它时崩溃。

您的代码具有未定义的行为,这意味着任何事情都可能发生。你可以通过声明 char test[] = "test"; 来解决这个问题。这将使 test[] 大到足以容纳四个字符和一个零字节。