gpt4 book ai didi

c - 为什么这个缓冲输出和内存分配的例子有缺陷?

转载 作者:行者123 更新时间:2023-12-04 18:20:19 27 4
gpt4 key购买 nike

我正在查看 "C Traps and Pitfalls" 第 5 章中给出的示例(PDF):

#include <stdio.h>

main()
{
int c;

char buf[BUFSIZ];
setbuf(stdout, buf);

while ((c = getchar()) != EOF)
putchar(c);
}

Unfortunately, this program is wrong, for a subtle reason. To see where the trouble lies, ask when the buffer is flushed for the last time.

Answer: after the main program has finished, as part of the cleaning up that the library does before handing control back to the operating system.But by that time, the buffer has already been freed!



main 只是一个必须清理堆栈和变量的函数。但这意味着什么:缓冲区已被释放?

我觉得很难理解。谁能详细解释一下?提前致谢。

最佳答案

您在堆栈上分配缓冲区,然后调用 setbuf 说“从现在开始将此缓冲区用于stdout”。

后来,当main返回时,它的堆栈帧(包括 buf 的内存)从堆栈中删除——但是 stdout仍在使用该地址的内存,因为这就是您告诉它要做的事情。问题是,内存现在可以被其他人重用——你的 C 运行时的关闭代码、中断等等——并且在 C 运行时开始刷新 stdout 之前,内存很可能会被其他一些数据覆盖。的缓冲区。

(就我个人而言,我不会使用术语“释放”来指代 buf 返回时 main 会发生什么——“释放”一词通常指的是堆分配,而不是堆栈分配。但不管你怎么称呼它,当 main 返回时,buf 是不再属于你的内存。)

有关该问题的更生动的说明,请参阅 Eric Lippert's answer关于在其范围之外使用局部变量的内存。这与您的示例中的问题相同。

关于c - 为什么这个缓冲输出和内存分配的例子有缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10826636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com