做有什么区别:
ptr = malloc (MAXELEMS * sizeof(char *));
要么:
ptr = calloc (MAXELEMS, sizeof(char*));
什么时候使用 calloc 而不是 malloc 是个好主意,反之亦然?
calloc()为您提供一个零初始化的缓冲区,malloc()而使内存未初始化。
calloc()
malloc()
对于大分配,主流操作系统下的大多数实现都会从操作系统(例如通过 POSIX或 Windows )calloc获得已知零页面,因此它不需要在用户空间中编写它们。这也是正常从操作系统获取更多页面的方式;只是利用操作系统的保证。mmap(MAP_ANONYMOUS)``VirtualAlloc``malloc``calloc
calloc
mmap(MAP_ANONYMOUS)``VirtualAlloc``malloc``calloc
这意味着calloc内存仍然可以是“干净的”和延迟分配的,并且写入时复制映射到系统范围的共享零物理页。(假设系统具有虚拟内存。)
一些编译器甚至可以为您优化 malloc + memset(0) 为 calloc,但如果您希望内存读取为0.
0
如果您在写入之前不打算读取内存,请使用malloc它以便(可能)从其内部空闲列表中为您提供脏内存,而不是从操作系统获取新页面。(或者不是将空闲列表上的一块内存归零以进行少量分配)。
malloc
如果没有操作系统,嵌入式实现calloc可能会将其自身保持为零内存,或者它不是一个花哨的多用户操作系统,它会将页面归零以阻止进程之间的信息泄漏。calloc
在嵌入式 Linux 上, malloc 可以mmap(MAP_UNINITIALIZED|MAP_ANONYMOUS),它仅对某些嵌入式内核启用,因为它在多用户系统上不安全。
mmap(MAP_UNINITIALIZED|MAP_ANONYMOUS)