这是我的程序:
#include <stdio.h>
int main(int argc, char* argv[]) {
char buf[1024] = {0};
setvbuf(stdout, buf, _IOFBF, 1024);
printf("error\n");
printf("%s\n", buf);
}
这是输出:
error
error
Exited: ExitFailure 7
为什么第 3 行和第 4 行都是空行?字符 '\n'
不是刷新输出缓冲区并稍后被丢弃吗?
您肯定会调用未定义(或至少未指定)的行为。您声明一个缓冲区,然后通过 setvbuf
将其传递给 stdout
。从那时起,缓冲区由 stdout
而不是你拥有,拥有。这意味着您可能无法再访问它。但这正是您所做的。
我无法从标准的措辞中证明这一点,但肯定有一些段落组合可以得出我的结论。
更新:ISO C99 在 7.19.5.6p2 中关于 setvbuf
函数的说明:数组的内容在任何时候都是不确定的。所以你所看到的只是巧合。您可能还会看到其他任何内容,仅靠 ISO C99 并不能保证。
更新 2: 因为数组的内容是不确定的,所以它们也可能都是非空字符。在这种情况下,buf
不再包含 string。因此,您显然调用了未定义的行为。
我是一名优秀的程序员,十分优秀!