1、相同点
- 都是C语言中用来进行动态内存申请的库函数
- 申请的空间在堆上,用完之后必须使用free来进行释放
- 如果空间申请空间成功,返回空间的首地址;如果申请失败返回的是NULL,因此在使用之前必须要进行判空
- 返回值类型都是void*,在接收返回值时必须进行强转
2、不同点
2.1 malloc
函数原型:void* malloc(size_t size)
malloc的参数是用户所申请的字节数,申请空间成功返回空间的首地址,如果申请失败,返回的是空,用户在进行接收时,必须要进行强转,在使用时必须要进行判空,使用完之后必须要借助free释放。
// 要申请20个int类型的空间
int* p=(int*)malloc(20*sizeof(int));
2.2 calloc
函数原型:void* calloc(size_t num, size_t size)
参数
- num:表示元素的个数
- size:表示单个元素所占的字节数
功能的不同:calloc会将其申请的内容空间初始化为 0
#include <malloc.h>
void Test1()
{
int* p1 = (int*)malloc(sizeof(int)*5);
int* p2 = (int*)calloc(5, sizeof(int));
printf("malloc的分配值:");
for (int i = 0; i < 5; i++)
{
printf("%d ", *p1++);
}
printf("\n");
printf("calloc的分配值:");
for (int j = 0; j < 5; j++)
{
printf("%d ", *p2++);
}
}
2.3 realloc
函数原型:void* realloc(void *p, size_t size)
- p == NULL—>该函数的功能与malloc类似
- p != NULL—>将p指向的空间大小调整到size字节
假设:p指向空间的大小为oldsize字节
- size <= oldsize:将p指向的空间缩小,然后返回原空间的首地址即可
- size > oldsize:将p指向的空间扩大
1)如果原内存空间足够大,系统将会在原内存空间的后面直接扩容,并且直接返回原内存空间的地址
2)如果原内存空间不够,系统将会重新申请一块内存(大小:原来与现在的和),把原来空间的数据拷贝到新的空间,将原来的空间释放
void Test2()
{
int size = 2000;
int* p1 = (int*)malloc(size * sizeof(int));
int* p2 = (int*)realloc(p1,sizeof(int)*20);
printf("malloc的首地址:%x\n",p1);
printf("realloc的首地址:%x\n", p2);
}