首页 > 解决方案 > C中的字符数组初始化

问题描述

我试图理解字符串中的数组概念。

char a[5]="hello";

这里,数组 a 是一个大小为 5 的字符数组。“hello”占用了从 0 到 4 的数组索引。由于我们已将数组大小声明为 5,因此字符串末尾没有空间存储空字符.

所以我的理解是当我们尝试打印a时,它应该打印直到遇到空字符。否则它也可能会遇到分段错误。

但是,当我在我的系统中运行它时,它总是打印“hello”并终止。

所以谁能澄清我的理解是否正确。还是取决于我们执行的系统。

标签: carraysstring

解决方案


与往常一样,答案是:

未定义的行为是未定义的。

这意味着,试图将此字符数组提供给处理字符串的函数是错误的。这是错误的,因为它不是string。C 中的字符串是以字符结尾的\0字符序列。

C 标准会告诉您这是未定义的行为。所以,任何事情都有可能发生。在 C 中,您没有运行时检查,代码只是执行。如果代码有未定义的行为,您必须为任何影响做好准备。这包括像您预期的那样工作,只是偶然。

数组之后内存中的字节很可能是一个\0字节。在这种情况下,它将查看处理此“字符串”的任何函数,就好像您向它传递了一个有效字符串一样。崩溃只是在等待对代码进行一些看似无关的更改。

您可以尝试char foo = 42;在数组定义之前或之后添加一些,您很可能会在输出中看到它。但是,当然,不能保证,因为同样,未定义的行为是未定义的 :)


推荐阅读