【发布时间】:2020-10-04 15:47:51
【问题描述】:
int main()
{
char c1[5]="abcde";
char c2[5]={'a','b','c','d','e'};
char *s1 = c1;
char *s2 = c2;
printf("%s",s1);
printf("%s",s2);
return 0;
}
在这段代码 sn-p 中,char 数组 C2 没有返回任何错误,但 char 数组 C1 返回的字符串太长。我知道 C1 必须要求大小为 6 才能存储 5 个字符,因为它将 \0 (NULL 字符)存储在最后一个索引中。但我很困惑为什么 C2 工作得很好?
此外,当使用%s 打印C2 时,输出为abcde@,其中@ 是一个乱码。 %s 和 printf 打印从给定地址开始的所有字符,直到遇到 \0。我不明白为什么要在末尾打印那个额外的字符?
【问题讨论】:
-
我刚刚回答了这个问题here(尽管该问题的OP需要从不同的角度进行解释)。无需发布重复的答案(尤其是因为您已经有了一个好的答案)。
-
不,
c1不得产生错误。问题很可能是您使用的是 C++,而不是 C 编译器来编译代码 -
无论如何,请您在问题中添加实际错误消息。
-
@AnttiHaapala:关于“不,
c1不得产生错误”:C 标准允许实现提供额外的诊断消息,尽管它应该是警告,而不是错误,因为程序应该被接受。 -
@EricPostpischil 这是真的。但是,我个人不知道任何会产生此消息的 C 编译器。