• malloc和calloc的差别


    摘自:https://www.cnblogs.com/mfrbuaa/p/5383026.html

        做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

       摘抄代码例如以下: 

     1 #include "ansidecl.h"
     2 #include <stddef.h>
     3 
     4 /* For systems with larger pointers than ints, this must be declared.  */
     5 PTR malloc (size_t);
     6 void bzero (PTR, size_t);
     7 
     8 PTR calloc (size_t nelem, size_t elsize)
     9 {
    10     register PTR ptr;  
    11 
    12     if (nelem == 0 || elsize == 0)
    13         nelem = elsize = 1;
    14   
    15     ptr = malloc (nelem * elsize);
    16     if (ptr) 
    17         bzero (ptr, nelem * elsize);
    18 
    19     return ptr;
    20 }

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

  • 相关阅读:
    Linux平台开发技术指南
    VIM 笔记 (for python )
    Python如何使用urllib2获取网络资源
    5种获取RSS全文输出的方法
    python IDE比较与推荐
    ESRI ArcGIS 9.0系列软件报价
    去年写的测试GDAL用法的一些函数
    有感所谓“研究”
    超强的病毒“诺顿是个SB”
    如何在博客中插入语法格式高亮的源代码
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14184999.html
Copyright © 2020-2023  润新知