动态内存开辟malloc、calloc、realloc、free函数
在C语言标准函数库中,提供了许多函数来实现对堆上的动态内存管理,有malloc函数、calloc函数、realloc函数和free函数,这些函数均包含在<stdio.h>头文件中。
下面让我来大概梳理一下这几个函数的具体内容及用法:
1.malloc函数
函数声明:void * malloc(int n);
说明:n为要求分配的字节数。
返回值:函数执行成功,malloc返回获得n个字节的内存空间的首地址;
函数执行失败,返回值为NULL。
①由于 malloc函数值的类型为void型指针,因此,需要将其值类型强行转换后赋给任意类型指针,这样就可以通过操
作该类型指针来操作从堆上获得的内存空间。
②除此之外,更需要注意的是,malloc函数分配得到的内存空间是未初始化的。(有可能申请到的内存空间之前被用过
,里面存在垃圾数据,不初始化程序有安全隐患)因此,一般在使用该内存空间时,我们可以通过调用另一个函数
memset来将其初始化为全0。
memset函数
memset函数声明如下:
void * memset (void * p,int c,int n) ;
说明:该函数可以将指定的内存空间按字节单位置为指定的字符c。其中,p为要清零的内存空间的首地址,c为要设 定的值,n为被操作的内存空间的字节长度。如果要用memset清0,变量c实参要为0。
注意:通过malloc函数开辟的堆内存必须使用memset函数来初始化。
C语言操作语句:
int * p=NULL;
p=(int *)malloc(sizeof(int));
if(p==NULL)
printf(“Can’t get memory!\n”);
memset(p,0,siezeof(int));
2.calloc函数
函数声明:void *calloc(int n,int size);
说明:函数返回值为void型指针。
返回值:执行成功,函数从堆上获得size*n的字节空间,并返回该空间的首地址;
执行失败,返回值为NULL。
calloc函数和malloc函数实现的功能相似,只不过calloc函数开辟的内存空间是经过初始化的。
C语言操作语句:
①用calloc开辟空间
int *p=NULL;
p = (int *)calloc(1,siezeof(int));
②用malloc开辟空间
int * p=NULL;
p=(int *)malloc(sizeof(int));
memset(p,0,siezeof(int));
上面两段代码表示的是一个意思,展示出来的也是同一个效果。
注意:calloc函数适合用于为数组申请空间(会自动初始化),可以将size设置为数组元素的空间长度,将n设置为数组
的容量。calloc函数的分配的内存需要自行释放。
说明:指针p必须指向堆内存空间;
n是指指针p指向的内存块的大小为n字节。
①n小于或等于p之前指向的空间大小:保持原有状态不变。
②n大于原来p之前指向的空间大小:如果当前连续内存块足够 realloc的话,只是将p所指向的空间扩大,并返
回p的指针地址;如果当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存q,并将 p指向的内容
copy到q,返回q,并将p所指向的内存空间删除。
这样也就是说 realloc有时候会产生一个新的内存地址,有的时候不会,所以在分配完成后,我们需要判断下p是否等
于 q。
注意:相比malloc函数和calloc函数,realloc函数的功能更为丰富,可以实现动态内存的分配以及释放。共同点就是:
均需要free函数来堆内存进行释放。
C语言操作语句:
p = (int *)malloc(sizeof(int)*24);
memset(p,0,sizeof(int)*24);
q = (int *)realloc(p,sizeof(int)*48); //将p指向内存空间从24int扩充到48个int
if(q != NULL)//realloc函数执行成功,将p释放,q为新内存指针
{
free(p);
p = NULL;
}
函数声明:void free (void * p);
说明:形参为void指针,free函数可以接受任意类型的指针实参。
该函数的含义就是回收内存。在C语言中,从堆上获得的内存空间在程序结束以后,系统不会将其自动释放,而是需
要程序员来自己处理。当一个程序结束后,必须保证所有从堆上获得的内存空间已被安全释放,否则,会导致内存泄
露,而free函数便可以实现释放内存的功能。
注意:free函数只是释放指针的指向的内容,表明指向的内存可以被别人使用,而该指针仍然指向原来指向的地方,
此时,指针为野指针,如果此时操作该指针会导致不可预期的错误。安全做法 是:在使用free函数释放指针指向的空
间之后,将指针的值置为NULL。
C语言操作语句:
free(p);
p=NULL;