做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; }
看了这段代码,能表达我心情的只有呵呵二字了
版权声明:本文为博主原创文章,未经博主允许不得转载。