2

我正在学习 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;

}

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

4

1 回答 1

5

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

发生这种情况时,buf超出范围,您将无法再合法使用它。所以程序将表现出未定义的行为。

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

于 2012-07-28T07:56:24.210 回答