malloc/calloc/realloc
malloc/calloc/realloc和free介绍:
- malloc函数
malloc函数可以从堆上获得指定字节的内存空间,其函数声明如下:
void * malloc(int n);
参数释义:
n:申请空间大小(单个类型大小*总个数)
函数详述:
其中,形参n为要求分配的字节数。如果函数执行成功,malloc返回获得内存空间的首地址;如果函数执行失败,那么返回值为NULL。由于malloc函数值的类型为void型指针,因此,可以将其值类型转换后赋给任意类型指针,这样就可以通过操作该类型指针来操作从堆上获得的内存空间。
需要注意的是,malloc函数分配得到的内存空间是未初始化的。
注意:通过malloc函数得到的堆内存必须使用memset函数来初始化。
- calloc函数
calloc函数的功能与malloc函数的功能相似,都是从堆分配内存。其函数声明如下:
void *calloc(int n,int size);
参数释义:
size:单个类型大小
n:申请的个数
注意:最后申请空间大小为: n和size相乘
函数详述:
函数返回值为void型指针。如果执行成功,函数从堆上获得size * n的字节空间,并返回该空间的首地址。如果执行失败,函数返回NULL。该函数与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。
- realloc函数
realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,其函数声明如下:
void * realloc(void * p,int n);
参数释义:
p:堆上已经存在空间的地址
n:空间的大小
函数详述:
其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。relloc函数分配的空间也是未初始化的。
注意:使用malloc函数,calloc函数和realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放。
2.2使用方法:
1、malloc()
头文件:stdlib.h
声明:void * malloc(int n);
含义:在堆上,分配n个字节,并返回void指针类型。
返回值:分配内存成功,返回分配的堆上存储空间的首地址;否则,返回NULL
初始化:未初始化
2、calloc()
头文件:stdlib.h
声明:void *calloc(int n, int size);
含义:在堆上,分配nsize个字节,并初始化为0,返回void 类型
返回值:同malloc() 函数
初始化:已初始化
3、recalloc()
头文件:stdlib.h
声明:void * realloc(void * p,int n);
含义:重新分配堆上的void指针p所指的空间为n个字节,同时会复制原有内容到新分配的堆上存储空间。注意,若原来的void指针p在堆上的空间不大于n个字节,则保持不变。
返回值:同malloc() 函数
初始化:未初始化
4、free()
头文件:stdlib.h
声明:void free (void * p);
含义:释放void指针p所指的堆上的空间。
返回值:无
5、memset()
头文件:string.h
声明:void * memset (void * p, int c, int n) ;
含义:对于void指针p为首地址的n个字节,将其中的每个字节设置为c。
返回值:返回指向存储区域 p 的void类型指针。
2.3malloc/calloc/realloc区别总结
相同点:
1.都是从堆上申请空间
2.都需要对返回值判空
3.都需要用户free释放
4.返回值类型相同(void*)
5.都需要类型转化
6.底层实现上是一样的,都需要开辟多余的空间,用来维护申请的空间
不同点:
1.函数名字不同和参数类型不同。
2.calloc会对申请空间初始化,并且初始化为0,而其他两个不会。
3.malloc申请的空间必须使用memset初始化
4.realloc是对已经存在的空间进行调整,当第一个参数传入NULL的时候和malloc一样
调整分为两种情况:
a:调整的空间比原有空间大:
1.大了一点:多出来的空间小于小于下面空闲的空间;
做法:
1.直接延伸申请空间
2.返回原空间首地址**
2.大了很多:多出来的空间,大于下面空闲空间
做法:
1.重新开辟新空间
2.将旧空间的内容拷贝到新空间中
3.释放旧空间
4.返回新空间的首地址
b.调整的空间比原有空间小:
做法:
1.将原空间缩小
2 .返回旧空间首地址
.alloca函数:
还有一个函数也值得一提,这就是alloca。其调用序列与malloc相同,但是它是在当前函数的栈帧上
分配存储空间,而不是在堆中。其优点是:当函数返回时,自动释放它所使用的栈帧,所以不必再为释
放空间而费心。其缺点是:某些系统在函数已被调用后不能增加栈帧长度,于是也就不能支持alloca函数。
尽管如此,很多软件包还是使用alloca函数,也有很多系统支持它。
malloc/calloc/realloc相关推荐
- malloc calloc realloc的对比
函数原型 三个函数的声明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* call ...
- 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现
内存分布 一.C语言中的动态内存管理方式:malloc/calloc/realloc和free 1.malloc: 从堆上获得指定字节的内存空间,函数声明:void *malloc (int n); ...
- C语言动态申请内存空间之malloc(),calloc(),realloc()函数
在C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项. malloc(),calloc ...
- c语言malloc,calloc,realloc函数介绍
malloc,calloc,realloc动态内存管理函数的出现解决了在某些c语言标准中不能使用变长数组的问题 这三个函数的使用需要头文件stdlib.h,这些函数开辟的空间在堆区,系统不会自动释放, ...
- malloc calloc realloc 三兄弟!!!
学习过C语言的都知道 malloc calloc realloc 这三个函数,这三个函数都是用于动态的分配内存的,最后都要使用 free函数进行释放. 这三个函数的头文件 : stdlib.h 在li ...
- c语言释放内存函数,【C语言】内存分配函数malloc/ calloc/ realloc及内存释放free
前言: 内存区域划分与分配: 1.栈区(stack)--程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放. 2.堆区(heap) -- 在内存开辟另一块存储区域 ...
- malloc,calloc,realloc,free函数
在进行C/C++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别: 1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取 ...
- 浅谈malloc,calloc,realloc函数之间的区别
内存区域可以分为栈,堆,静态存储区和常量存储区.局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:m ...
- malloc calloc realloc
(类型*)malloc(size) (类型*)calloc(n,size) (类型*)realloc(*ptr,size) (1) malloc 分配指定字节数的存储区.此存储区中的初始值不确定 (2 ...
最新文章
- linux内核oops错误码说明,Oops 定位错误代码行
- 09(maven+SSH)网上商城项目实战之使用jersey实现应用服务器和图片服务器分离...
- [蓝桥杯][算法提高VIP]项链(dfs)
- 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)
- rf连oracle版本一致,Navicat premium连不上Oracle的问题解决
- javascript事件之:谈谈自定义事件
- paip.c#.nett 系统托盘动态图标闪烁图标
- 全民营销,只看这篇文章就够了
- linux搭建nacos集群
- matlab besselh,关于用matlab求bessel函数零点
- 道路千万条,转行第一条。材料不劝退,亲人两行泪。
- (判断题)两台路由器之间转发的数据包一定不携带VLAN TAG?
- linux u盘 慢_SUSE 10.0 U盘写入速度慢的最终解决方案--及两个Linux系统能否共享同一个swap分区...
- SpringCloud 整合 Dubbo
- Redis-使用和原理
- Three.js光源梳理3——平行光(DirectionalLight)
- RAM、ROM、FLASH的存储原理及区别
- 删除下拉框只找23火星软件_下拉框优化首选23火星软件
- 闪存颗粒SLC、MLC、TLC、QLC
- 1734-AENTR/1734-AENT IP设置及在5000软件中组态方法