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

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

char test[4] = "test";
printf("%s\n", test );
printf("%lu\n", strlen(test) );

它会编译,正确打印出该值,并strlen返回正确的值,这意味着编译器知道char数组中的最后一个字符在哪里。那么为什么我们必须在末尾添加“ \ 0”。这只是惯例吗?还是还有别的?

谢谢。

gnasher729

您将test明确声明为四个字符的数组,因此它是四个字符的数组,其中包含't','e','s'和't'。

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么我们需要纯<?>在Java中?

来自分类Linux

为什么我们在芹菜中需要签名?

来自分类Java

为什么我们需要Java中的默认方法?

来自分类Linux

为什么我们需要mktemp?

来自分类Python

为什么我们在Python中需要“ finally”子句?

来自分类Java

为什么我们在Hadoop堆栈中需要ZooKeeper?

来自分类Java

为什么我们需要Java中的弱引用

来自分类Java

为什么我们到底需要Java中的StringBuffer

来自分类Dev

为什么我们需要需求?

来自分类Dev

我们为什么需要`ngDoCheck`

来自分类Dev

为什么我们需要单子?

来自分类Dev

为什么我们需要C ++中的虚函数?

来自分类Dev

为什么我们在C ++中需要飞船<=>运算符?

来自分类Java

为什么我们需要Java中的Properties类?

来自分类Dev

为什么我们需要Python中的属性?

来自分类Dev

为什么我们需要Clojure中的'in(require'[...]])?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们在MongoDB中需要created_at

来自分类Dev

为什么我们需要cmake?

来自分类Dev

为什么我们需要python中的协程?

来自分类Dev

为什么我们在git中需要SSH密钥?

来自分类Dev

我们为什么需要ʻiteratoreltype()`?

来自分类Dev

为什么我们需要语义描述符?

来自分类Dev

为什么我们在Typescript中需要任何类型?

来自分类Dev

为什么我们需要声明枚举变量?(C)

来自分类Dev

为什么我们需要Kubernetes中的服务帐户?

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么我们在区块链中需要 TLSNotary?