为什么是main()本地的缓冲区,然后无法显式关闭流的bug?

sha*_*nwu 2 c linux buffer systems-programming

我正在学习linux系统编程,O'reilly.它说:"一个常见的错误是将缓冲区声明为在流关闭之前结束的范围内的自动变量.特别是,注意不要在main()本地提供缓冲区,然后无法显式关闭流. "

然后它显示了一个错误的代码示例:

#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;

}
Run Code Online (Sandbox Code Playgroud)

我编译并执行代码..并没有真正理解这种代码会导致什么...请帮助我理解这个概念,谢谢大家.

Mat*_*Mat 5

在该示例中,stdout将在main返回后刷新.

当这种情况发生时,buf超出范围,你就不能合法地使用它了.因此程序将显示未定义的行为.

buf只要stdout是开放就需要活着,并且stdout经常保持开放直到main回来之后.因此,您应该使用全局,静态或堆分配的缓冲区.