arrays - 是否必须为字符数组的初始化提供 '\0' ?
问题描述
请看代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char name[10] = {'L','e','s','s','o','n','s'}; // did not add `\0`
char c;
for (int i = 0; name[i] != '\0'; i++)
{
c = name[i];
printf("%c", c);
}
return 0;
}
我最后没有给\0
,但它仍然有效。
我的问题:\0
在上述情况下是否自动添加?
编辑:在这些情况下会发生什么:
char name[7] = {'L','e','s','s','o','n','s'};
char name[8] = {'L','e','s','s','o','n','s'};
对于编辑问题,我深表歉意。
解决方案
在 C 中,任何类型的部分初始化的数组对于其余的都是 0 初始化的。所以,
int foo[5] = {1, 2, 3};
将初始化foo
为{1, 2, 3, 0, 0}
. 因此,当您不添加'\0'
到末尾时,不仅末尾将是'\0'
(假设数组足够大以容纳它),而且数组的所有剩余元素都将是'\0'
.
如果您的数组不够大,无法容纳空终止符,则不会添加它,该值甚至也不重要。读取数组末尾是未定义的行为,这可能导致段错误、垃圾数据或更糟。
推荐阅读
- python - 使用 python 优化网格连接
- angular - 测试 Quagga onProcessed, onDetected in angular 4 Jasmine and karma
- java - 忽略警告的后果是什么:java中未经检查的转换
- dynamic - 调用 COBOL 程序的默认模式是什么?静态还是动态?
- python - 将数据框的列值聚合到新的数据框
- c# - 在可预测的错误发生之前停止循环
- r - R中主成分分析中的内积
- reactjs - HOC 传递属性
- c# - Xamarin Android SpeechRecognizer - SpeechRecognizerError.Network
- google-analytics - 在 Google Analytics(分析)仪表板上检查事件参数