fprintf是否在引擎盖下使用malloc()?

Adr*_*ala 17 c malloc printf stdio

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

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

pax*_*blo 21

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

在glibc的(方面源在这里),也来电mallocstdio-common/vfprintf.c,其中很多的printf下端家庭使用,所以我不会依赖于它,如果我是你.甚至字符串缓冲区输出调用sprintf,你可能认为不需要它,似乎在设置一些类似棘手FILE的字符串句柄后解析为该调用- 请参阅libio/iovsprintf.c.

我的建议是编写自己的代码来执行输出,以确保没有内存分配(当然,希望它write本身不会这样做(比*printf执行它更简单)).既然你可能不会输出很多转换的东西(可能只是"Dang, I done run outta memory!"),那么对格式化输出的需求无论如何都应该是有问题的.


(a) C99环境考虑因素表明(至少)某些早期实施具有缓冲限制.从我对Turbo C的记忆中,我认为4K是关于限制的,事实上,C99表示(in 7.19.6.1 fprintf):

任何单次转换可以产生的字符数应至少为4095.

(C89的任务是编纂现有的做法,而不是创造一种新的语言,这就是为什么这些最小的最大值被置于标准中的一个原因 - 它们被推迟到标准的后续迭代中).


bdo*_*lan 8

C标准并不保证fprintf不会malloc在引擎盖下打电话.实际上,它并不能保证你覆盖时会发生什么malloc.您应该参考特定C库的文档,或者只编写您自己fprintf的函数,它可以直接进行系统调用,避免任何堆分配的可能性.