在c语言中在堆区分配空间常用malloc和free函数配套使用,但是对于三个相似的函数malloc,calloc,realloc的区别在这里说明。
- malloc函数
函数原型为
void* malloc(size_t size)
括号里面写分配的字节大小,通常需要手算,如分配20个int的对象sizoef(int)*20,分配的值不会初始化代码如下。
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p=(int*)malloc(20*sizeof(int));
for(int i=0;i<20;i++)
{
printf("%d\n",*p++);
}
free(p);
}
可以看到分配的空间里的值为无效值。
- calloc
函数原型为 void* calloc(size_t num,size_t size)
功能和malloc相似,第一个参数填分配的int个数,第二个填一个int的字节大小,如分配20个字节 calloc(20,sizeof(int))
,分配的空间会初始化为0。
有利有弊,虽然calloc的使用方法比malloc容易理解,但是因为会对空间初始化,所以效率没有malloc高。 - realloc
函数原型为void* realloc (void* ptr, size_t size)
功能是重分配ptr指向的空间的大小。保存原有的值,新的空间所在的值是不确定的。
代码如下
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p=(int*)malloc(20*sizeof(int));
int *pp = (int*)calloc(20,sizeof(int));
int *p1 =p;
int *pp1 = pp;
for(int i=0;i<20;i++)
{
printf("%d\n",*p++);
}
for(int i=0;i<20;i++)
{
printf("%d\n",*pp++);
}
int *ppp =(int*)realloc(p1,600*sizeof(int));
for(int i=0;i<30;i++)
{
printf("%d\n",*ppp++);
}
free(p);
free(pp);
free(ppp);
}