C中的字符数组初始化

基尔塔纳

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

char a[5]="hello";

在这里,数组a是大小为5的字符数组。“ hello”占据了数组索引的0到4。由于我们已经将数组大小声明为5,所以在字符串末尾没有空间存储空字符。 。

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

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

任何人都可以澄清我的理解是否正确。还是取决于我们执行的系统。

用户名

像往常一样,答案是:

未定义的行为是未定义的

这意味着,尝试将此字符数组提供给处理字符串的函数错误的这是错误的,因为它不是字符串中C是字符序列,与一个结束\0字符。

C标准将告诉您这是未定义的行为因此,任何事情都可能发生。在C语言中,您没有运行时检查,仅执行代码。如果代码具有未定义的行为,则必须做好任何准备这包括意外地进行预期的工作。

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

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

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章