calloc、malloc、realloc函数的区别及用法
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函数的区别及用法相关推荐
- malloc,calloc和realloc函数
malloc:分配内存,不初始化 calloc:清零分配,初始化为0 realloc:重新分配,不初始化
- 关于call和apply函数的区别及用法
call和apply函数是function函数的基本属性,都可以用于更改函数对象和传递参数,是前端工程师常用的函数.具体使用方法请参考以下案列: 例如: 申明函数: var fn = function ...
- StretchBlt函数和BitBlt函数的区别和用法
StretchBlt和BitBlt都用用来显示一幅图像 一.StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩.也即是将内存中的位图拷贝到屏幕上 ...
- array()、range() 和 arange()函数的区别和用法
目录 一.array() 函数 二.range() 函数 三.arange() 函数 四.对比一下range() 和 arange() 一.array() 函数 np.array(object, dt ...
- C语言 realloc函数 带着内存游走的函数
realloc函数 realloc函数,带着内存游走的函数. 该函数将 ptr 指向的内存大小修改为size.内存中的数据从开头到size保留不变. 如果size大于原内存大小,则多出的部分会被初始化 ...
- alloc()、malloc()、calloc()、realloc()区别及用法
C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等. 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. ...
- C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别
2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...
- 浅谈malloc,calloc,realloc函数之间的区别
内存区域可以分为栈,堆,静态存储区和常量存储区.局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:m ...
- C语言动态申请内存空间之malloc(),calloc(),realloc()函数
在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...
最新文章
- Scratch青少年编程能力等级测试模拟题(三级)
- [转] Windows Server 2012 Beta Cluster (Hyper-V 3.0)-SMB篇
- Nginx服务器版本升级需求分析
- 基于django的视频点播网站开发-step11-后台用户管理功能...
- Elasticsearch的倒排索引是什么?
- 麦咖啡Agent安装完后不合图标和不马上在EPO服务器上显示客户端的问题
- 数据算法之二叉树插入(BinaryTreeL Insert)的Java实现
- JS中的setInterval 函数体带参数f方法
- 为何python不好找工作-为什么说Python不好找工作?原因在这里!
- javaweb实现教师和教室管理系统 java jsp sqlserver
- AJAX请求和普通HTTP请求区别
- paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.
- visio2016专业版2018最新密钥和下载方法 整理
- python中chardet库的安装和导入
- 链路聚合LACP配置与结果验证
- 144项PPT制作计划(精化)
- 《老路用得上的商学课》26-30学习笔记
- Region Proposal by Guided Anchoring论文解读
- Openstack 简单梳理,(自用 慎点)
- 按关键词搜索商品 淘宝API
热门文章
- Linux下TCP最大连接数受限问题
- mybatis_helloword(1)
- fflush(stdin)与fflush(stdout)
- 安卓开发:关于适配的问题
- Oracle 不同用户之间 大量数据转移的方法测试
- 当微信小程序遇上TensorFlow:Server端实现补充
- [LeetCode] Permutations II 全排列之二
- 增加和删除用户组与用户
- 干货|知道Excel这9个小技巧,不做二傻子!
- Open***+AD+Google authenticator 安装、配置