malloc和calloc的区别

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

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

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

时间: 2024-11-13 10:43:03

malloc和calloc的区别的相关文章

realloc,malloc,calloc的区别

三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内 它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: char* p; p=(char*)malloc(

malloc、calloc、realloc、new以及alloca函数区别

malloc.calloc.realloc.new以及alloca函数 一.综合叙述 1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化. 2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 按照所给的数据个数和数据类型所占字节数,分配一个

malloc realloc calloc free

自上次发现自己对这几个C函数不熟悉,就打算抽空整理一下,也就现在吧.这几个函数都是跟堆内存打交道的,还有一个好玩的函数--alloca,它是跟栈内存打交道的,我想留在以后研究出好玩点的来,再专门为其写一篇铭文. 1.malloc: 头文件:<stdlib.h> 原型:extern void *malloc(unsigned int num_bytes); 功能:分配长度为num_bytes字节的内存块.如果分配成功则返回指向被分配内存的指针,否则返回NULL. 机理:malloc函数的实质体现

malloc,calloc,realloc

三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内 它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL 1.  malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: char* p; p=(char*)mal

C/C++中的malloc、calloc与new的区别

函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和,每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小: void *calloc(size_tnumElements,size_tsizeOfElement); 如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的

C malloc和calloc函数总结

malloc和calloc可以动态的分配内存,即:编译的时候不会分配内存运行的时候才会分配内存.很像高级语言中的new关键字. 这样的好处自然是不用多说.现在对他们的用法及注意点进行总结: 先看malloc,代码如下: #include <stdio.h> #include <stdlib.h> #define N 5 int main() {     int i = 0;     int * nums;     nums = (int *)malloc(N*sizeof(int)

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

C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小. void *calloc(size_t numElements,size_t sizeOfElement); 如果调用成功,函数mall

malloc与new的区别

malloc与new的区别 从本质上来说,malloc是libc里面实现的一个函数,如果在source code中没有直接或者间接include过stdlib.h,那么gcc就会报出error:‘malloc’ was not declared in this scope.如果生成了目标文件(假定动态链接malloc),如果运行平台上没有libc,或者libc中没有malloc函数,那么会在运行时(Run-time)出错.new则不然,是c++的关键字,它本身不是函数. new不依赖于头文件,c

malloc()与calloc差别

Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from the other. Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slightly different from