gpt4 book ai didi

c - fprintf 是否在幕后使用 malloc() ?

转载 作者:太空狗 更新时间:2023-10-29 16:30:32 26 4
gpt4 key购买 nike

我想要一个最小的 o-damn-malloc-just-failed 处理程序,它将一些信息写入文件(可能只是标准错误)。我宁愿使用 fprintf() 而不是 write(),但如果 fprintf() 本身尝试 malloc(),这将严重失败。

是否有一些保证,无论是在 C 标准中,还是在 glibc 中,fprintf 都不会这样做?

最佳答案

不,不能保证它不会。但是,我见过的大多数实现都倾向于使用固定大小的缓冲区来创建格式化输出字符串 (a)

就 glibc ( source here ) 而言,在 stdio-common/vfprintf.c 中有 malloc 的调用,这是一个很多 printf 系列都在低端使用,所以如果我是你,我不会依赖它。即使是像 sprintf 这样的字符串缓冲区输出调用,你可能认为不需要它,在设置了一些棘手的 FILE 之后似乎也解决了那个调用字符串句柄 - 请参阅 libio/iovsprintf.c

我的建议是然后编写自己的代码来执行输出,以确保不会在幕后进行内存分配(当然,希望 write 本身不会这样做(不像 *printf 那样做))。由于无论如何您可能都不会输出太多转换后的内容(可能只是“该死,我的内存用完了!”),无论如何对格式化输出的需求应该是值得怀疑的。


(a) C99 环境方面的考虑表明(至少)某些早期实现具有缓冲限制。根据我对 Turbo C 的内存,我认为 4K 是极限,事实上,C99 声明(在 7.19.6.1 fprintf 中):

The number of characters that can be produced by any single conversion shall be at least 4095.

(C89 的任务是对现有实践进行编纂,而不是创建一种新语言,这就是为什么其中一些最小最大值被纳入标准的原因之一——它们被推进到标准的后续迭代中)。

关于c - fprintf 是否在幕后使用 malloc() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6743034/

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