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