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

Ani*_*aul 0 c arrays string printf char

样本1:

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

输出: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);
Run Code Online (Sandbox Code Playgroud)

输出:HII♥喜♥♦

样本3:

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

输出:hihi

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

样品1和样品2几乎是类似的代码,除了额外的线char l = a[i],样品3与样品1和2的不同,基于阵列大小的声明.

Som*_*ude 5

在C中,数组只有一个大小,但没有终止符.因此,两个字符的数组(如前两个示例)将包含您指定的两个字符,而不是其他任何字符.当你循环寻找"终结者"时,你将走出界限并有未定义的行为.

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