c - C中几乎相同程序的不同输出

标签 c arrays string char printf

示例 1:

char a []={'h','i'};
int i;
for(i=0;a[i]!='\0';i++){
printf("%c",a[i]);
}
printf("%s",a);

Output: hi☻hi♥

示例 2:

char a []={'h','i'};
int i;
for(i=0;a[i]!='\0';i++){
    char l = a[i];
    printf("%c",a[i]);
}
printf("%s",a);

Output:hii♥hi♥♦

示例 3:

char a [5]={'h','i'};
int i;
for(i=0;a[i]!='\0';i++){
printf("%c",a[i]);
}
printf("%s",a);

Output: hihi

为什么这三个程序的输出不一样?

示例 1 和示例 2 除了多了一行 char l = a[i] 之外几乎是相似的代码,示例 3 与示例 1 和 2 的区别在于数组大小的声明.

最佳答案

在C语言中,数组只有大小,没有终止符。所以两个字符的数组(就像你的前两个例子)将有你指定的两个字符,没有别的。当您循环寻找“终结者”时,您将越界并产生未定义的行为

第三种情况不同,因为您定义了一个包含五个元素的数组,但只初始化了前两个。然后 C 标准要求将数组的其余部分初始化为零,这与字符 '\0' 相同。第三个例子中的数组仍然没有明确的终止符,只是碰巧余数被初始化为与字符串终止符相同的值。

关于c - C中几乎相同程序的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40396744/

相关文章:

c++ - 如何在 Igraph + C 中保留节点的位置和名称

c - 如何从二进制文件读取和写入 float ?

python - 数组上的 Cython 最小值和最大值

c - 在 C 中使用字符串数组

c - 在 C 上保存文件

c - linux 中的异步 memcpy?

java - 给定一个输入中的两个字符串(用逗号分隔),如何在 Java 中找出字符串 S1 的排列是否等于字符串 S2?

javascript - 在javascript中从json数组构建树,没有父键但有前缀

javascript - 为什么 charAt() 和 charCodeAt() 被称为安全?

c - 使用 C 中的 Do..while 循环登录