您的位置:首页 > 编程语言 > C语言/C++

malloc和calloc的区别

2015-07-17 14:41 218 查看
    做C这么久了,才了解calloc函数也是挺丢人的。

    从网上找了很多关于这两者区别的文章,有的甚至总结了好多人的结论。但我感觉都没有说的很明白。

    其中关于函数原型的区别根本就没必要再讨论了,是个人都能看出参数不一样。需要讨论的是从原型中反应出的问题。

    从原型上看,malloc的含义是“给我一个大小为size的连续内存”,而calloc貌似是“给我n个大小为size的内存”。由于这样的原型,有人说(不知道是不是官方也这么说)calloc返回的对象数组而malloc只是一块连续的内存。这让我产生了很大的迷惑,为什么返回值只有一个?难道返回的是数组的首地址,数组里面存的是分配的n块内存的地址?难道calloc的n个大小为size的连续内存,在这n个之间却可能是不连续的?如果是这样对这块内存怎么释放呢?“n个大小为size的内存”这句话本身就有歧义(是“一块内存大小是n个size”呢?还是“n块内存每块大小为size”),带着这些疑问我看了看用calloc申请的内存是如何用free来释放的,结果是跟malloc一样只free一次就够了。这个结果瞬间让我觉得calloc就是个谜一样的存在。

    这个网址(http://www.cnblogs.com/ecizep/p/4417573.html)中在比较二者时有这么一段描述:

    “malloc在分配内存的时候会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,根据malloc实现策略的不同,malloc每次在分配的时候,可能分配的空间比实际要求的多些,多次分配会导致更多的这种浪费,当然,这些都跟malloc的实现有关”。

    记录内存的使用情况是很正常的啊,要不内存怎么用free来释放呢?但是这里强调malloc的这一点却没有说calloc,难道calloc不用记录?那么free是如何释放用它申请的空间的?calloc到底是个什么?太神奇了,我该看看calloc的源码。

    从下面这个网址我找到了一段calloc的源码(apple的地址至少还稍具权威性),虽然实现方式有多种,但这段代码就足以能够说明calloc是什么了:

    http://www.opensource.apple.com/source/gcc/gcc-5575.11/libiberty/calloc.c
   摘抄代码如下:

#include "ansidecl.h"
#include <stddef.h>

/* For systems with larger pointers than ints, this must be declared.  */
PTR malloc (size_t);
void bzero (PTR, size_t);

PTR
calloc (size_t nelem, size_t elsize)
{
register PTR ptr;

if (nelem == 0 || elsize == 0)
nelem = elsize = 1;

ptr = malloc (nelem * elsize);
if (ptr) bzero (ptr, nelem * elsize);

return ptr;
}


   看了这段代码,能表达我心情的只有呵呵二字了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  calloc malloc C语言