我正在学习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; }
我编译和执行代码..并不真正明白这种代码会导致什么…请帮助我理解这个概念,谢谢大家。
在这个例子中, stdout
在main
返回后被刷新。
发生这种情况时, buf
超出范围,您不能再合法使用它了。 所以程序会显示未定义的行为。
只要stdout
打开, buf
需要存活,而stdout
通常保持打开状态,直到main
返回。 所以你应该使用一个全局的静态或堆分配缓冲区。