0x01 理论

在程序运行的时候临时决定需要分配多少存储区空间,这种方法叫动态内存分配
为了使用动态内存分配,需要用到一组标准函数,包含标准头文件 stdlib.h

malloc
函数原型:extern void *malloc(unsigned int num_bytes);
功能:可以动态分配一组连续的字节
说明1:这个函数需要一个整数类型参数表示需要分配的字节个数
返回值:
     分配成功,分配好的第一个字节的地址
     分配失败,返回NULL
说明2:这个函数把返回值放到一个无类型的存储区里,需要首先转换成有类型指针然后才能使用

calloc
函数原型:void *calloc(size_t n, size_t size);
功能:动态分配n个长度为size的连续空间
参数一:希望分配的存储区个数
参数二:当个存储区的大小
返回值:
     分配成功,返回指向分配起始地址的指针
     分配失败,返回NULL

realloc
函数原型:extern void *realloc(void *mem_address, unsigned int newsize);
功能:调整一段动态分配内存的大小
说明:新的大小可大可小(如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失

计算机不会自动回收动态分配的内存,如果程序中不在需要使用某些动态分配的内存,就需要使用专门的语句把它们还给计算机

free
函数原型:void free(void *ptr);
功能:用来释放动态分配的内存
说明:需要动态分配内存的第一个地址作为参数,一起分配的内存必须一起释放

0x02 动态内存分配Demo

调用函数可以使用被调用函数动态分配的内存
注:如果使用指针参数参数调用free函数,则函数结束后指针变成野指针,我们要把它分配成空指针

1
2
3
4
5
6
7
8
9
10
11
12
13
//demo 1
#include "stdio.h"
#include "stdlib.h"
int main(){
int *p_num = (int *)malloc(5 * sizeof(int));
if(!p_num){
/* code */
return 0;
}
free(p_num);
p_num = NULL;
return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
// demo2
#include "stdio.h"
#include "stdlib.h"
int main(){
int *p_num = (int *)malloc(10 * sizeof(int))
if(p_num){
free(p_num);
p_num = NULL;
}
/* code */
return 0;
}