我想知道哪些C标准库函数在底层使用malloc
和free
。 我认为printf
会使用malloc
,但是当我使用valgrind
测试程序时,注意到printf
调用没有使用malloc
分配任何内存。那么它是如何管理内存的呢?
我想知道哪些C标准库函数在底层使用malloc
和free
。 我认为printf
会使用malloc
,但是当我使用valgrind
测试程序时,注意到printf
调用没有使用malloc
分配任何内存。那么它是如何管理内存的呢?
fprintf
吗?缓冲区不是在其他地方管理吗? - Oliver Charlesworthdtoa
也不是标准C语言。) - Oliver Charlesworthprintf("%.*g", number, precision")
。例如尝试使用 number=1e-300
和 precision=1000
。你肯定需要动态分配内存来完成这个任务。 - Gunther Piezfgetc()
这样的函数,但是任何操作 FILE *
后面的标准 I/O 函数都可以。你可以使用 setbuf()
和 setvbuf()
函数提供缓冲区来覆盖系统提供的缓冲区,但是大多数人大多数时间不这样做,标准 I/O 库会为他们提供一个缓冲区。在至少一些系统上,该缓冲区是通过 malloc()
分配的。(今天没有检查就从记忆中工作:我相信 Solaris 就是这样的系统之一。) - Jonathan Lefflerlibc
版本。对于 C 规范和实现,不应有任何限制。printf
通常使用堆栈帧上的内存,但当它确实需要时,它会直接调用内部函数 _malloc_r()
。valgrind
,不确定它是否能检测到 _malloc_r()
的使用。libc
版本”是唯一正确的答案。Newlib在其官方文档中实际上按函数列出了所需的操作系统例程。如果一个函数将sbrk
列为必需的操作系统函数,则它使用某种形式的malloc
。 - Brian McFarlandvoid foo(int x)
{
if (!x) malloc(1);
}
如果您使用非0
的参数调用此函数,则valgrind将不会注意到它可能实际调用了malloc()
。可以把valgrind
想象成一个虚拟机(因为它就是这样):它不查看您的代码,只看到机器实际执行的内容。
mmap()
系统调用不太可能使用malloc()
库函数。 - Jonathan Lefflerprintf不需要一次性形成整个输出字符串,它可以逐个部分地发送到输出,并在遇到格式说明符时,可以将该数据片段作为已形成的数据输出,并继续处理其余字符串。
最多只需要一个本地定义的字符数组(在堆栈上)足够大,以容纳它可以处理的最大整数或浮点数,这并不是很大。