malloc和calloc之间的区别?

做什么之间有什么区别:

ptr = (char **) malloc (MAXELEMS * sizeof(char *));

要么:

ptr = (char **) calloc (MAXELEMS, sizeof(char*));

什么时候在malloc上使用calloc是一个好主意,反之亦然?


calloc()将初始化缓冲区,而malloc()使内存未初始化。

编辑:

清零内存可能需要一点时间,所以如果性能出现问题,您可能需要使用malloc() 。 如果初始化内存更重要,请使用calloc() 。 例如, calloc()可能会为您保存对memset()的调用。


一个鲜为人知的区别是,在内存分配比较乐观的操作系统中,像Linux一样, malloc返回的指针在程序实际触及它之前不会被真实存储器支持。

calloc的确触及了内存(它将零写入它),因此您可以确定操作系统正在使用实际的RAM(或交换)支持分配。 这也是为什么它比malloc慢(不仅需要将其清零,操作系统还必须通过可能的交换其他进程来找到合适的内存区域)

有关malloc行为的进一步讨论,请参阅此SO问题


calloc一个经常被忽视的优点是(符合实现)它将有助于保护您免受整数溢出漏洞的攻击。 比较:

size_t count = get_int32(file);
struct foo *bar = malloc(count * sizeof *bar);

size_t count = get_int32(file);
struct foo *bar = calloc(count, sizeof *bar);

如果count大于SIZE_MAX/sizeof *bar ,则前者可能导致极小的分配和随后的缓冲区溢出。 后者在这种情况下会自动失败,因为无法创建大对象。

当然,您可能需要寻找不符合实现的实现,它们会忽略溢出的可能性......如果这是您的目标平台所关注的问题,则无论如何您都必须对溢出进行手动测试。

链接地址: http://www.djcxy.com/p/4863.html

上一篇: Difference between malloc and calloc?

下一篇: Regular cast vs. static