当前位置 博文首页 > 维欣~fighting?:关于内存分配函数的那些事
1、使用完毕需手动释放内存空间
2、从堆上分配
3、返回值类型为void*
,如果内存分配失败就会返回NULL
则用malloc函数开辟动态内存后一定要判断函数返回值是否为NULL
4、函数原型:void* malloc (size_t);
5、用法举例:
int *p;
p=(int*)malloc(30*sizeof(int));
开辟了30个int类型的空间,然后把p指向这个空间的位置。在这里的指针是指向第一个int值,并非我们所有开辟的30个int的空间
因为malloc返回的是void*
,所以malloc前要用(int *)
进行强转。
1、函数原型:void* calloc(size_t num,size_t size);
2、开辟的内存空间是一个数组空间,有num个元素,每个元素有size个字节,内存大小为numsize
3、返回值类型为 void*
,返回的地址为开辟空间的首地址,如果开辟失败,则返回NULL。
4、与malloc的区别是:
① calloc()会在返回地址之前,将所申请的内存空间中的每个字节都初始化为0.
② calloc()会在分配内存的同时清楚内存
例如:int *p = calloc(3,sizeof(int));
分配了34=12个字节
1、函数原型:void *realloc(void *ptr,size_f size);
ptr是指向需要修改的内存块的指针,size是请求修改的大小
2、realloc用来修改已分配的内存块的大小
3、如果调整成功,返回值是调整大小后内存的起始位置;如果失败,则返回NULL,所以要对返回值进行判空。
4、在扩大内存空间时会出现的两种情况:
(1)ptr所指向的内存后有足够的内存空间用来扩展
(2)ptr所指向的内存后没有足够的内存空间用来扩展
则在堆上重新找一个大小合适的连续空间来使用,这样函数返回的是一个新的内存地址。
如果新的内存空间申请成功,则会将ptr所指向的内存中的内容拷贝到新的内存空间中,ptr所指向的内存会被释放,返回新的内存地址;如果不成功,ptr所指向的内存不会被释放,函数返回NULL。
5、p = realloc(ptr,size)
函数返回值不为空时,释放内存不需要写free(ptr),只需要写free(p)
6、申请的内存空间不会进行初始化
1、用来释放动态开辟的内存
2、函数原型:void free(void *ptr);
指针参数是指向malloc等函数动态申请的内存地址,这块内存释放后会返还给堆,虽然指针指向这块区域,但可以重新分配这块数据
3、一般来说,free释放的是最新开辟的一个内存空间
如果程序中malloc了,但是没有free,则会造成内存泄漏(即在程序运行过程中,系统会一直被申请内存,造成可用内存不断减少)
4、在free之后,需要将ptr再次置空,即ptr = NULL;
,如果不置空,后面程序如果通过ptr会再次访问到已经释放/无效的/已经被回收再利用的内存。
5、free不能同时释放一块内存。
在使用以上函数时,需要加头文件#include <stdlib.h>
cs