做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. VS2015_动态链接库学习

    非MFC动态链接库 创建一个名为ex1的Win32项目 创建一个DLL项目,保留预编译的头文件   默认文件 创建完成项目之后,包含几个默认的文件   stdafx.h文件用于包含标准系统包含的头文件 ...

  2. MySQL启动很慢的原因

    我们在启动MySQL的时候,常常会遇到的是, 当执行启动命令后,它会"Start MySQL ....." 一直不停的执行,也不中断,也不成功 这里会出现此现象的原因有以下三条: ...

  3. Mysql自带profiling性能分析工具使用分享

    1. show variables like '%profiling%';(查看profiling信息)       2. set profiling=1;(开启profiling)   3. 执行S ...

  4. PHP解决并发问题的几种实现

    对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了 在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制. 方案一:使用文件锁排它锁 f ...

  5. HTML+CSS小技巧

    网页标题前引入ico图标 <link rel="shortcut icon" href="img/icoTest.ico">

  6. Linux下进程信息/proc/pid/status的深入分析

    https://blog.csdn.net/beckdon/article/details/48491909

  7. Lunix含Ubuntu使用总结

    错误 鼠标闪烁解决 系统设置->显示—>未知显示器->关闭->应用->选择当前配置 提示sudo: unable to resolve host ,亦即无法解析主机. 原 ...

  8. ubuntu sublime text 3 build 3083 license

    经验证:sublime text 3 3083可用 ----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855605813A03D ...

  9. docker 解决network has active endpoints

    解决方式 使用 docker network disconnect -f {network} {endpoint-name},其中的 {endpoint-name} 可以使用命令 docker net ...

  10. Vijos1448 校门外的树 [树状数组]

    题目传送门 校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K= ...