动态内存分配
- 1. 概念
- 程序运行时临时分配存储区的方法
- 2. 优点
- 临时决定需要分配的存储区数量
- 生命周期自己决定
- 以前讲声明变量,在变量生命周期开始的时候,计算机为变量分配存储区,生命周期结束的时候,计算机把变量的存储区收走。而动态内存分配是我们需要的时候,要求计算机为我们分配存储区,并且计算机不会主动把存储区收走
- 3. 使用方法
- malloc 函数可以动态分配一组连续的字节
int *p_val = (int *)malloc(5 * sizeof(int));
-
- free 函数可以释放一组动态分配的字节
free(p_val);
-
- calloc 函数也可以动态分配内存并且把内存内容都设置成0
- calloc用法和 malloc 基本一样,最大区别就是malloc 分配的存储区内容是随机的
- calloc 函数也可以动态分配内存并且把内存内容都设置成0
int *p_val = (int *)calloc(5, sizeof(int));
-
- 以上函数使用之前都需要包含 stdlib.h 头文件
-
- 动态分配内存和数组的结构一样,可以把 p_val 当做数组名称来使用动态分配内存
-
- 动态分配内存释放之前可以在不同的函数间自由传递(比如调用函数使用被调函数的存储区),因为动态分配内存的生命周期是由程序来管理的
//使用动态分配内存的代码框架1
#include <stdio.h>
#include <stdlib.h>
int main() {
//malloc 需要一个整数做参数,表示希望分配的字节个数,(5个整数类型存储区的总大小)
//malloc 的返回值代表分配好的第一个字节的地址,并将地址记录在一个无类型指针存储区里
//所以在使用用之前最好进行强制类型转换
//这条语句就可让计算机分配20个连续字节,因为连续,所以可以把它们当做数组来使用
int *p_val = (int *)malloc(5 * sizeof(int));
int *p_val1 = (int *)calloc(5, sizeof(int));
//如果动态内存返回失败,malloc函数的返回值是空地址
//所以使用malloc应该使用分支处理 动态内存分配成功的情况
if (p_val) {
//使用动态分配内存
//动态分配的内存当不在使用时必须要主动还给计算机,即:释放动态内存。
//如果不释放,计算机会认为这些内存还在被使用,其他程序将无法使用这些内存。把这种现象叫内存泄露。
//free函数参数是 动态分配内存中第一个字节的地址
free(p_val);
//p_val指针将会成为野指针,必须得把它恢复成空指针
p_val = NULL;
}
return 0;
}
//使用动态分配内存的代码框架1
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p_val = (int *)malloc(5 * sizeof(int));
if (!p_val) {
return 0;
}
//使用动态分配内存
free(p_val);
p_val = NULL;
return 0;
}
来源:CSDN
作者:Ka.
链接:https://blog.csdn.net/guaiderzhu1314/article/details/104211926