考虑以下计划。
#include <stdio.h>
int main(void)
{
char side_a[] = "Side A";
char dont[] = {'W', 'O', 'W', '!' };
char side_b[] = "Side B";
puts(dont); /* dont is not a string */
return 0;
}
我知道puts()函数在遇到空字符时会停止。但在上面的程序中我没有指定null字符。那么什么时候停止打印?该程序是否调用未定义的行为?是否可以保证在各种C编译器上获得相同的输出? C标准对此有何看法?
答案 0 :(得分:4)
puts
将最终读取dont
的最后一个元素,这是未定义的行为。
所以不,你不能保证每次都有相同的输出。您根本不保证任何输出 - 您不能保证任何,因为这是未定义的行为。
答案 1 :(得分:3)
是的,此错误导致您的程序没有定义的行为。正如该术语所表明的那样,你不能期望在执行这样一个程序时出现任何合理的事情。
答案 2 :(得分:2)
是的,它将是Undefined Behaviour,所以输出不会一直相同。 如果你想在这种情况下打印,我建议如下输出统一:
printf("%.*s", 4, dont);