calloc、malloc、realloc函数的区别及用法!

三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异。

(1)malloc函数。其原型void *malloc(unsigned int num_bytes);
num_byte为要申请的空间大小,需要我们手动的去计算,如int *p = (int *)malloc(20*sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋值给指针p,此时申请的内存值是不确定的。

(2)calloc函数,其原型void *calloc(size_t n, size_t size);
其比malloc函数多一个参数,并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),这样就省去了人为空间计算的麻烦。但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0;

实例:

    int *p = (int *)malloc(20*sizeof(int));int *pp = (int *)calloc(20, sizeof(int));int i;printf("malloc申请的空间值:\n\n");for ( i=0 ; i < 20; i++){printf("%d ", *p++);}printf("\n\n");printf("calloc申请的空间的值:\n\n");for ( i=0 ; i < 20; i++){printf("%d ", *pp++);}printf("\n");

结果:

很多人会疑问:既然calloc不需要计算空间并且可以直接初始化内存避免错误,那为什么不直接使用calloc函数,那要malloc要什么用呢?
实际上,任何事物都有两面性,有好的一面,必然存在不好的地方。这就是效率。calloc函数由于给每一个空间都要初始化值,那必然效率较malloc要低,并且现实世界,很多情况的空间申请是不需要初始值的,这也就是为什么许多初学者更多的接触malloc函数的原因。

(3)realloc函数和上面两个有本质的区别,其原型void realloc(void *ptr, size_t new_Size)
用于对动态内存进行扩容(及已申请的动态空间不够使用,需要进行空间扩容操作),ptr为指向原来空间基址的指针, new_size为接下来需要扩充容量的大小。
实例:

int main(void)
{const int size = 2000;int *p = (int *)malloc(20*sizeof(int));int *pp = (int *)realloc(p, size*sizeof(int));printf("原来的p_Address:%x   扩容后的pp_Address:%x \n\n", p, pp);return 0;
}

结果:

可从图看出,扩容后地址和原先地址是不一样的,但是这仅仅取决于扩容的内存大小。

实际上:

如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块(20+size)*sizeof(int)的内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。注意:如果扩容后的内存空间较原空间小,将会出现数据丢失,如果直接realloc(p, 0);相当于free(p).

calloc、malloc、realloc函数的区别及用法相关推荐

  1. malloc,calloc和realloc函数

    malloc:分配内存,不初始化 calloc:清零分配,初始化为0 realloc:重新分配,不初始化

  2. 关于call和apply函数的区别及用法

    call和apply函数是function函数的基本属性,都可以用于更改函数对象和传递参数,是前端工程师常用的函数.具体使用方法请参考以下案列: 例如: 申明函数: var fn = function ...

  3. StretchBlt函数和BitBlt函数的区别和用法

    StretchBlt和BitBlt都用用来显示一幅图像 一.StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩.也即是将内存中的位图拷贝到屏幕上 ...

  4. array()、range() 和 arange()函数的区别和用法

    目录 一.array() 函数 二.range() 函数 三.arange() 函数 四.对比一下range() 和 arange() 一.array() 函数 np.array(object, dt ...

  5. C语言 realloc函数 带着内存游走的函数

    realloc函数 realloc函数,带着内存游走的函数. 该函数将 ptr 指向的内存大小修改为size.内存中的数据从开头到size保留不变. 如果size大于原内存大小,则多出的部分会被初始化 ...

  6. alloc()、malloc()、calloc()、realloc()区别及用法

    C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别.  ...

  7. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

  8. 浅谈malloc,calloc,realloc函数之间的区别

    内存区域可以分为栈,堆,静态存储区和常量存储区.局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:m ...

  9. C语言动态申请内存空间之malloc(),calloc(),realloc()函数

    在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...

最新文章

  1. Scratch青少年编程能力等级测试模拟题(三级)
  2. [转] Windows Server 2012 Beta Cluster (Hyper-V 3.0)-SMB篇
  3. Nginx服务器版本升级需求分析
  4. 基于django的视频点播网站开发-step11-后台用户管理功能...
  5. Elasticsearch的倒排索引是什么?
  6. 麦咖啡Agent安装完后不合图标和不马上在EPO服务器上显示客户端的问题
  7. 数据算法之二叉树插入(BinaryTreeL Insert)的Java实现
  8. JS中的setInterval 函数体带参数f方法
  9. 为何python不好找工作-为什么说Python不好找工作?原因在这里!
  10. javaweb实现教师和教室管理系统 java jsp sqlserver
  11. AJAX请求和普通HTTP请求区别
  12. paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
  13. visio2016专业版2018最新密钥和下载方法 整理
  14. python中chardet库的安装和导入
  15. 链路聚合LACP配置与结果验证
  16. 144项PPT制作计划(精化)
  17. 《老路用得上的商学课》26-30学习笔记
  18. Region Proposal by Guided Anchoring论文解读
  19. Openstack 简单梳理,(自用 慎点)
  20. 按关键词搜索商品 淘宝API

热门文章

  1. Linux下TCP最大连接数受限问题
  2. mybatis_helloword(1)
  3. fflush(stdin)与fflush(stdout)
  4. 安卓开发:关于适配的问题
  5. Oracle 不同用户之间 大量数据转移的方法测试
  6. 当微信小程序遇上TensorFlow:Server端实现补充
  7. [LeetCode] Permutations II 全排列之二
  8. 增加和删除用户组与用户
  9. 干货|知道Excel这9个小技巧,不做二傻子!
  10. Open***+AD+Google authenticator 安装、配置