c - C中的字符数组初始化
问题描述
我试图理解字符串中的数组概念。
char a[5]="hello";
这里,数组 a 是一个大小为 5 的字符数组。“hello”占用了从 0 到 4 的数组索引。由于我们已将数组大小声明为 5,因此字符串末尾没有空间存储空字符.
所以我的理解是当我们尝试打印a时,它应该打印直到遇到空字符。否则它也可能会遇到分段错误。
但是,当我在我的系统中运行它时,它总是打印“hello”并终止。
所以谁能澄清我的理解是否正确。还是取决于我们执行的系统。
解决方案
与往常一样,答案是:
未定义的行为是未定义的。
这意味着,试图将此字符数组提供给处理字符串的函数是错误的。这是错误的,因为它不是string。C 中的字符串是以字符结尾的\0
字符序列。
C 标准会告诉您这是未定义的行为。所以,任何事情都有可能发生。在 C 中,您没有运行时检查,代码只是执行。如果代码有未定义的行为,您必须为任何影响做好准备。这包括像您预期的那样工作,只是偶然。
数组之后内存中的字节很可能是一个\0
字节。在这种情况下,它将查看处理此“字符串”的任何函数,就好像您向它传递了一个有效字符串一样。崩溃只是在等待对代码进行一些看似无关的更改。
您可以尝试char foo = 42;
在数组定义之前或之后添加一些,您很可能会在输出中看到它。但是,当然,不能保证,因为同样,未定义的行为是未定义的 :)
推荐阅读
- angular - 如何为 PrimeNG 的 slidemenu backlabel 属性添加属性?
- c# - 我在这个 for 循环中搞砸了什么?
- r - 在 ggplot 中创建并排条形图
- c++ - 对于这个问题,是否有更好的数据结构和算法选择?
- c# - 创建多个连接查询 - Dapper
- android - 由于从位图转换为字节缓冲区,应用程序正在崩溃。tflite 模型或位图到字节缓冲区的转换有什么问题吗?
- javascript - 错误:未找到 Gradle DSL 方法:'implemantation()' 可能的原因
- python-3.x - 使用 psycopg2 插入 Postgres 数据库
- ios - 调整 UIToolBar 高度的问题 | 迅速
- python - 有没有办法解码具有字符串格式数字的json?