码迷,mamicode.com
首页 > 其他好文 > 详细

malloc和calloc的区别

时间:2015-07-17 16:17:31      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:calloc malloc c语言

    做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;
}

   看了这段代码,能表达我心情的只有呵呵二字了

版权声明:本文为博主原创文章,未经博主允许不得转载。

malloc和calloc的区别

标签:calloc malloc c语言

原文地址:http://blog.csdn.net/midsum/article/details/46926699

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!