前言
malloc()、calloc()、realloc()都是动态内存管理的函数,再头文件stdio.h中。
一、malloc
1、函数原型
void* malloc(size)
size,是需要在堆申请的的内存大小,单位是字节
void*,是返回类型,因为默认的返回类型是void*,所以在正常的使用时,需要强转类型;若申请空间失败(内存已满),会返回NULL。
例:
//malloc
int* p=(int*)malloc(10*sizeof(int));
二、calloc
1、函数原型
void* calloc(num,size);
num,是用来确定需要申请多少个size字节大小的空间
size,是用来确定每一个空间的大小
void*,是返回类型,因为默认的返回类型是void*,所以在正常的使用时,需要强转类型;若申请空间失败(内存已满),会返回NULL。
还会初始化每一个空间初始化为0
例:
//calloc
int* p=(int*)calloc(10,sizeof(int));
//申请了10个整型的空间,并且每个空间初始化为0
三、realloc
void* realloc(ptr,size)
realloc是用来扩容的,当malloc或者calloc在堆上申请的空间使用超出后,这时候就需要扩容了。
所以ptr是原来malloc或calloc申请的空间的地址
size,是新申请的内存大小,如果size为0的话,就会释放掉这块空间
//realloc
int* p=malloc(10*sizeof(int));
//当malloc申请的内存空间用完了就需要扩容
p=(int*)realloc(p,10*sizeof(int));
扩容分为原地扩容和异地扩容:
原地扩容:
异地扩容:
旧的空间还会被释放掉
总结
malloc(): 用于分配指定大小的内存块,内容未初始化。
calloc(): 用于分配指定数量的元素的内存块,并将内存初始化为零。
realloc() :用于改变之前分配的内存块的大小,可以扩大或缩小内存块。
而且在动态申请空间后,需要使用free,来释放空间,不然就会导致内存泄漏等问题