c - 为什么缓冲区位于 main() 本地,然后无法显式关闭流是一个错误?

标签 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;

}

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

最佳答案

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

当这种情况发生时,buf超出了范围,您不能再合法地使用它。因此程序将表现出未定义的行为。

只要 stdout 打开,

buf 就需要存在,并且 stdout 通常保持打开状态,直到 main 之后已经回来了。因此您应该使用全局、静态或堆分配的缓冲区。

关于c - 为什么缓冲区位于 main() 本地,然后无法显式关闭流是一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699251/

相关文章:

c - fgets 在输入之前读取上一行

c - 解释器中的函数指针

c - 从终端读取数字字符串并保存在 c 中的数组中

Linux:恢复网络连接时执行命令

c - 如何将字符串插入缓冲区?

c - 如果 volatile 对线程没有用,为什么原子操作需要指向 volatile 数据的指针?

linux - 是否可以使用 "kill"向进程发送信号而不强制进程退出?

c++ - gdb 7.0,SIGCONT 信号不会中断 pause() 调用

android - 混合两个音频缓冲区时的咔嗒声/失真

linux -/proc/net/tcp 中 tx_queue & rx_queue 的单位