我正在学习 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;
}
我编译并执行代码..并且不太明白这种代码会导致什么...请帮助我理解这个概念,谢谢大家。
最佳答案
在该示例中,stdout
将在 main
返回后刷新。
当这种情况发生时,buf
超出了范围,您不能再合法地使用它。因此程序将表现出未定义的行为。
stdout
打开,buf
就需要存在,并且 stdout
通常保持打开状态,直到 main
之后已经回来了。因此您应该使用全局、静态或堆分配的缓冲区。
关于c - 为什么缓冲区位于 main() 本地,然后无法显式关闭流是一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699251/