为什么是main()的本地缓冲区,然后不能显式地closures这个stream的错误?

我正在学习linux系统编程,O'reilly。 它说:“一个常见的错误是声明缓冲区作为一个自动variables在一个范围内结束之前closuresstream特别是,要小心不要提供一个本地缓冲区的main(),然后不能显式closuresstream。 “

那么它显示一个错误的代码示例:

#include <stdio.h> int main() { char buf[BUFSIZ]; /*set stdin to block-buffered with a BUFSIZ buffer*/ setvbuf(stdout,buf,_IOFBF,BUFSIZ); printf("Arr!\n"); return 0; } 

我编译和执行代码..并不真正明白这种代码会导致什么…请帮助我理解这个概念,谢谢大家。

在这个例子中, stdoutmain返回后被刷新。

发生这种情况时, buf超出范围,您不能再合法使用它了。 所以程序会显示未定义的行为。

只要stdout打开, buf需要存活,而stdout通常保持打开状态,直到main返回。 所以你应该使用一个全局的静态或堆分配缓冲区。