堆上分配内存的相关函数
进行动态内存分配时常用的库函数
一:malloc函数
-
函数定义:void* malloc(size_t size)
参数是在heap里分配的内存空间的字节数大小,数据类型是size_t(正整数)
-
例:表示在堆上请求四个字节,我们把malloc返回的地址存入void指针变量
void *p = malloc(4);
-
常用:如下使用sizeof,它以字节的形式返回变量或者类型的大小(sizeof返回的大小*需要的单元数)
void *p = malloc(10*sizeof(int));
*p = 2;//这一条是错误的,我们不能解引用一个void指针
-
为了解引用,我们需要一个整型指针,我们这里做类型转换
int *p = (int*)malloc(10*sizeof(int));
*p = 2//这条就可执行
calloc函数
-
calloc函数的定义:void* calloc(size_t num, size_t size)
calloc接收两个参数,第一个参数是特定类型的元素数量,第二个参数是类型的大小
-
例:
int *p = (int *)calloc(3,sizeof(int))
-
malloc和calloc的区别:malloc分配完内存后并不会对其进行初始化,所以如果没有填入值将会得到一些随机值;而calloc会对其进行初始化为0
realloc函数
如果有一个动态分配的内存,要想修改内存块的大小就可以用realloc
-
realloc函数的定义:void* realloc(void* ptr, size_t size)
realloc接收两个参数,第一个是指向已分配内存的起始指针地址,第二个参数是新的内存块的大小
-
例:这个函数会请求一块新的大小是2n的内存,然后把之前那个内存的内容拷贝过去
工作原理:如果请求的新块大于之前的块,就可以扩展之前的块,如果能够在之前的块的基础上找到连续的内存,那么扩展之前的块,否则就分配新的内存。把之前的块拷贝过去,然后释放之前的内存
int *B = (int*)realloc(A,2*n*sizeof(int));
-
若如下:整个A都会被释放掉
int *A = (int*)realloc(A,0); //相当于free(A)
-
如果第一个参数是NULL,那么它和调用malloc是一样的效果,这时会创建一个新的内存块,而不会从之前的内存块拷贝任何数据
int *B = (int*)realloc(NULL,n*sizeof(int));
free函数
函数malloc , calloc ,realloc分配的内存,要使用函数free来释放
-
函数free的参数是内存的起始地址
-
作用是释放内存