1

考虑以下程序。

#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() 函数在遇到空字符时会停止。但是在上面的程序中我没有指定空字符。那么什么时候停止打印呢?这个程序是否调用了未定义的行为?是否保证在各种 C 编译器上为该程序获得相同的输出?C标准对此有何评论?

4

3 回答 3

4

puts最终会读到 的最后一个元素dont,这是未定义的行为。

所以不,你不能保证每次都有相同的输出。就此而言,您根本无法保证任何输出 - 您无法保证任何输出,因为这是未定义的行为。

于 2015-06-06T09:46:15.433 回答
3

是的,此错误会导致您的程序没有定义的行为。正如该术语所表明的那样,您不能期望从执行这样的程序中产生任何合理的结果。

于 2015-06-06T09:46:24.143 回答
2

是的,它将是Undefined Behavior,因此输出不会一直相同。如果您想在这种情况下打印,我建议如下进行统一输出:

printf("%.*s", 4, dont);
于 2015-06-06T09:51:40.813 回答