做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的差别的更多相关文章

  1. malloc()与calloc差别

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  2. malloc()与calloc差异

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  3. Linux C 堆内存管理函数malloc()、calloc()、realloc()、free()详解

    C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般 ...

  4. C语言中malloc()和calloc()c函数用法

    C语言中malloc()和calloc()c函数用法   函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...

  5. [reprint]malloc与calloc的区别

    [http://blog.163.com/crazy20070501@126/] 转自某自由人的博客: malloc与calloc的区别 函数malloc()和calloc()都可以用来动态分配内存空 ...

  6. malloc,calloc,realloc,alloc

    三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(si ...

  7. malloc、calloc、relloc

    1.malloc void * malloc(size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针. 2.calloc void ...

  8. malloc和calloc用法

    malloc和calloc用法 #include <stdio.h> #include <stdlib.h> int main(){ int n; printf("i ...

  9. malloc,calloc,realloc函数用法,原理及不同解析

    https://blog.csdn.net/lixungogogo/article/details/50887028 一.malloc malloc在MSDN中原型为: void *malloc( s ...

随机推荐

  1. vue单选,多选,多选的内容显示在页面可删除

    vue做单选只能选一个 <template> <div class="list"> <!-- 多行多列单选 --> <span>只能 ...

  2. python是如何进行内存管理的?

    Python内存管理机制 Python内存管理机制主要包括以下三个方面: 引用计数机制 垃圾回收机制 内存池机制 引用计数 举个例子说明引用是什么: 1 如上为一个简单的赋值语句,1就是对象,a就是引 ...

  3. Linux硬链接和软连接的区别与总结

    图示软硬链接的区别 有关硬链接的总结 具有相同inode节点号的多个文件互为硬链接文件: 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除: 只有删除了源文件和所有对应的硬链接文件,文件实体才 ...

  4. IDEA添加其他项目为库文件的方法

    IDEA添加其他项目为库文件的方法 2014年1月23日星期四 20:46 问题:如果我通过引用项目修改了被引用库项目的源代码,他没法自动编译,所以不会立即反应到引用项目. 在Eclipse中,很简单 ...

  5. Delphi XE增强的RTTI妙用--动态创建包中的窗口类

    以前要在运行时创建package中的form类,必须要在form单元文件中这样注册类: Initialization  RegisterClass(TForm3);Finalization  UnRe ...

  6. properties文件不能输入中文

    先把他关掉,然后对message.properties 文件右键--属性(properties), 右边最下面一行text file encoding选择other里面的最后一个utf-8, 再点击a ...

  7. 【严蔚敏】【数据结构题集(C语言版)】1.16 自大至小依次输出读入的三个整数X,Y,Z

    #include <stdio.h> #include<stdlib.h> int main() { int x,y,z,temp; scanf("%d%d%d&qu ...

  8. PHP之数组(遍历顺序)

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2009/08/23/1065.html PHP的数组, 如果用foreach来访问, 遍历的顺序是固定 ...

  9. thinkphp5.0模块设计

    5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改). 目录结构 标准的应用和模块目录结构如下: ├─applica ...

  10. 《java虚拟机》----java内存模型与线程

    No1. No2. java内存模型规定了所有的变量都存储在主内存中(Main Memory)中 每条线程还有自己的工作内存(Working Memory) 线程的工作内存中保存了被该线程使用到的变量 ...