这样做的区别是什么:
ptr=(char**)malloc(maxelms*sizeof(char*);
或:
ptr=(char**)calloc(maxelms,sizeof(char*);
什么时候最好使用calloc而不是malloc,反之亦然
calloc()为您提供零初始化缓冲区,而malloc()使内存未初始化
对于大型分配,主流操作系统下的大多数calloc实现将从操作系统获得已知的零页面(例如,通过POSIXmmap(MAP_ANONYMOUS)或WindowsVirtualAlloc),因此不需要在用户空间中编写它们。这就是普通malloc从操作系统获取更多页面的方式calloc只是利用了操作系统的保证
这意味着calloc内存仍然可以“干净”并延迟分配,并在写入时复制映射到系统范围的零共享物理页。(假设系统具有虚拟内存。)
有些编译器甚至可以为您将malloc+memset(0)优化为calloc,但如果您希望内存读取为0,则应该显式使用calloc
如果您在写入内存之前不打算读取内存,请使用malloc,这样它就可以(潜在地)从内部空闲列表中为您提供脏内存,而不是从操作系统中获取新页面。(或者,不是将空闲列表上的内存块归零,而是进行小规模分配)
如果没有操作系统,则calloc的嵌入式实现可能会让calloc本身将内存归零,或者它不是一个奇特的多用户操作系统,可以将页面归零以阻止进程之间的信息泄漏
在嵌入式Linux上,malloc可以mmap(MAP|u UNINITIALIZED | MAP|u ANONYMOUS),这只对一些嵌入式内核启用,因为它在多用户系统上不安全