malloc/calloc/realloc区别与联系
malloc/calloc/realloc和free介绍:
1 malloc函数
定义与声明: 在堆上,分配n个字节,并返回void指针类型。其函数声明如下:
void * malloc(int n);
参数释义:
n:申请空间大小(单个类型大小*总个数)//类型大小为字节
函数详述:
-
函数返回值为void型指针。如果执行成功,函数从堆上获得n个字节的空间,并返回该空间的首地址。如果执行失败,函数返回NULL。
-
由于malloc函数值的类型为void型指针,因此,可以将其值类型转换后赋给任意类型指针,这样就可以通过操作该类型指针来操作从堆上获得的内存空间。
-
需要注意的是,malloc函数分配得到的内存空间是未初始化的。
注意:通过malloc函数得到的堆内存必须使用memset函数来初始化。
2 calloc函数
定义与声明: 在堆上,分配n * size个字节,并初始化为0,返回void *类型。其函数声明如下:
void *calloc(int n, int size);
参数释义:
size:单个类型大小
n:申请的个数
注意:最后申请空间大小为: n和size相乘
函数详述:
-
函数返回值为void型指针。如果执行成功,函数从堆上获得size * n的字节空间,并返回该空间的首地址。如果执行失败,函数返回NULL。
-
该函数与malloc函数的不同是,calloc函数得到的内存空间是初始化的,其内容全为0。
-
calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。
3 realloc函数
定义与声明: 重新分配堆上的void指针p所指的空间为n个字节,同时会复制原有内容到新分配的堆上存储空间。其函数声明如下:
void * realloc(void *p, int n);
参数释义:
-
p:堆上已经存在空间的地址
-
n:空间的大小
函数详述:
-
其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。
-
realloc函数将指针p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,保持原有状态不变。如果n大于原来p之前指向的空间大小,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上,p之前指向的空间被释放。
-
relloc函数分配的空间也是未初始化的。
3 free函数
定义与声明: 释放void指针p所指的堆上的空间。
void free (void * p);
参数释义:
p:堆上已经存在空间的地址
函数详述:
- 释放void指针p所指的堆上的空间。
注意:使用malloc函数,calloc函数和realloc函数分配的内存空间都要使用free函数或指针参数为NULL的realloc函数来释放
4 memset函数
定义与声明: 对于void指针p为首地址的n个字节,将其中的每个字节设置为a。
void * memset (void * p, int a, int n) ;