malloc, calloc, realloc 使用及区别
来源:互联网 发布:笔记本电脑咋下载软件 编辑:程序博客网 时间:2024/06/14 02:52
堆空间
malloc, calloc, realloc 函数分配的空间位于堆空间, C语言内存分布包括栈空间、堆空间、数据段(包括BSS段)、代码段。
malloc
函数原型: void* malloc (size_t size);
功能:请求系统动态分配size个字节的空间,如果分配成功则返回第一个字节的地址。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针。
calloc
函数原型: void* calloc (size_t num, size_t size);
功能:在内存的动态分配区中分配num个长度为size的连续空间。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针。
malloc与calloc区别:
- malloc不能初始化所分配的内存空间,也就是说malloc分配好空间后要对所分配的空间进行清理。而函数calloc会将所分配的内存空间中的每一位都初始化为零。也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针。
- 函数malloc向系统申请分配指定size个字节的内存空间.返回类型是 void*类型.void*表示未确定类型的指针. void* 类型可以强制转换为任何其它类型的指针.
realloc
函数原型: void* realloc (void* ptr, size_t size);
功能:先判断当前的指针是否有足够的连续空间,如果有,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照size指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来ptr所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址,即重新分配存储器块的地址。
返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针。
使用总结:
- realloc失败的时候,返回NULL
- realloc失败的时候,原来的内存不改变,不会释放也不会移动
- 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址;假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址
- 如果size为0,效果等同于free()。
- 传递给realloc的指针必须是先前通过malloc(), calloc(),或realloc()分配的或者空指针
- 传递给realloc的指针可以为空指针,等同于malloc。
示例
#include "stdio.h"#include "stdlib.h"int main() { int *a, *b, *c; a = (int*)malloc(sizeof(int)); *a = 2; b = (int*)realloc(nullptr, sizeof(int)); *b = 3; printf("a=%d, b=%d\n", *a, *b); c = (int*)realloc(a, sizeof(int)); *c = 4; printf("a=%d, b=%d\n", *a, *b);}
输出结果:
a=2, b=3
a=4, b=3
阅读全文
1 0
- malloc, calloc, realloc 使用及区别
- malloc、calloc、realloc的用法及区别
- malloc,realloc,calloc的用法及区别
- malloc calloc realloc 区别
- malloc,calloc,realloc区别
- malloc calloc realloc 区别
- malloc calloc realloc 区别
- malloc、realloc、calloc区别
- malloc calloc 及 realloc
- malloc、calloc、realloc的使用和区别
- malloc calloc realloc使用及实现原理
- realloc,malloc,calloc的区别
- malloc、calloc、realloc的区别
- realloc,malloc,calloc的区别
- malloc、calloc、realloc的区别
- malloc、calloc、realloc的区别
- malloc、calloc、realloc的区别
- realloc,malloc,calloc的区别
- 随便写写
- ubuntu16.04 安装Sublime Text 3
- Solr搜索引擎(2)Solrj
- org.apache.spark.sql.AnalysisException: Try to map struct<>to Tuple1 异常
- <![CDATA[ ]]>和转义字符的使用
- malloc, calloc, realloc 使用及区别
- 快速排序算法C语言实现
- 【AC梦工厂】广工华工联合训练1 H
- jQuery整理
- 全民暗黑APK+IOS双端文字教程+商业手工端
- codevs 4919 线段树:区间更新,区间查询(余数)
- Android Studio创建不同分辨率的Drawable文件夹
- delete from和truncate删除的区别详解
- C++ 标准异常