C 动态内存分配

北慕城南 提交于 2020-02-07 21:03:01

动态内存分配

  • 1. 概念
    • 程序运行时临时分配存储区的方法
  • 2. 优点
    • 临时决定需要分配的存储区数量
    • 生命周期自己决定
    • 以前讲声明变量,在变量生命周期开始的时候,计算机为变量分配存储区,生命周期结束的时候,计算机把变量的存储区收走。而动态内存分配是我们需要的时候,要求计算机为我们分配存储区,并且计算机不会主动把存储区收走
  • 3. 使用方法
    • malloc 函数可以动态分配一组连续的字节
int *p_val = (int *)malloc(5 * sizeof(int));
    • free 函数可以释放一组动态分配的字节
free(p_val);
    • calloc 函数也可以动态分配内存并且把内存内容都设置成0
      • calloc用法和 malloc 基本一样,最大区别就是malloc 分配的存储区内容是随机的
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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!