DAY5

发布时间 2023-07-27 21:59:44作者: Ninnne

堆上分配内存的相关函数

进行动态内存分配时常用的库函数

一:malloc函数

  1. 函数定义:void* malloc(size_t size)

参数是在heap里分配的内存空间的字节数大小,数据类型是size_t(正整数)

  1. 例:表示在堆上请求四个字节,我们把malloc返回的地址存入void指针变量

void *p = malloc(4);
  1. 常用:如下使用sizeof,它以字节的形式返回变量或者类型的大小(sizeof返回的大小*需要的单元数)

void *p = malloc(10*sizeof(int));
*p = 2;//这一条是错误的,我们不能解引用一个void指针
  1. 为了解引用,我们需要一个整型指针,我们这里做类型转换

int *p = (int*)malloc(10*sizeof(int));
*p = 2//这条就可执行

calloc函数

  1. calloc函数的定义:void* calloc(size_t num, size_t size)

calloc接收两个参数,第一个参数是特定类型的元素数量,第二个参数是类型的大小

  1. 例:

    int *p = (int *)calloc(3,sizeof(int))
  2. malloc和calloc的区别:malloc分配完内存后并不会对其进行初始化,所以如果没有填入值将会得到一些随机值;而calloc会对其进行初始化为0

realloc函数

如果有一个动态分配的内存,要想修改内存块的大小就可以用realloc

  1. realloc函数的定义:void* realloc(void* ptr, size_t size)

realloc接收两个参数,第一个是指向已分配内存的起始指针地址,第二个参数是新的内存块的大小

  1. 例:这个函数会请求一块新的大小是2n的内存,然后把之前那个内存的内容拷贝过去

工作原理:如果请求的新块大于之前的块,就可以扩展之前的块,如果能够在之前的块的基础上找到连续的内存,那么扩展之前的块,否则就分配新的内存。把之前的块拷贝过去,然后释放之前的内存

int *B = (int*)realloc(A,2*n*sizeof(int)); 
  1. 若如下:整个A都会被释放掉

int *A = (int*)realloc(A,0); //相当于free(A)
  1. 如果第一个参数是NULL,那么它和调用malloc是一样的效果,这时会创建一个新的内存块,而不会从之前的内存块拷贝任何数据

int *B = (int*)realloc(NULL,n*sizeof(int)); 

 

free函数

函数malloc , calloc ,realloc分配的内存,要使用函数free来释放

  1. 函数free的参数是内存的起始地址

  2. 作用是释放内存