C 语言从 0 入门(十六)|动态内存管理:malloc /free/calloc /realloc 精讲

大家好,我是网域小星球。

之前我们用数组时,大小必须提前写死,比如 int arr[50]。但实际开发中,我们常常不知道要存多少数据 ,这时候就需要动态内存

动态内存可以在程序运行时随时申请、随时释放,非常灵活,是进阶必备知识点。

目录

一、本章学习目标

二、为什么要用动态内存?

三、四个核心函数

[2. free ------ 释放内存](#2. free —— 释放内存)

[4. realloc ------ 扩容 / 缩容](#4. realloc —— 扩容 / 缩容)

四、完整示例:动态数组

五、动态内存实现可扩容学生管理

六、高频易错点

七、本章总结

下期预告

一、本章学习目标

  1. 理解栈内存与堆内存的区别
  2. 掌握 malloc 动态申请内存
  3. 掌握 free 释放内存,避免内存泄漏
  4. 理解 callocmalloc 的区别
  5. 掌握 realloc 调整内存大小
  6. 野指针、空指针、内存泄漏等常见问题

二、为什么要用动态内存?

  • 数组大小固定,不够灵活
  • 数据少时浪费空间,数据多时溢出
  • 动态内存:用多少申请多少,不用就释放

三、四个核心函数

头文件:

cpp 复制代码
#include <stdlib.h>
  1. malloc ------ 申请内存
cpp 复制代码
void *malloc(size_t size);

示例:申请 4 个 int

cpp 复制代码
int *p = (int *)malloc(4 * sizeof(int));
  • 成功:返回指向内存的指针
  • 失败:返回 NULL,必须判断!

2. free ------ 释放内存

cpp 复制代码
free(p);
p = NULL;   // 非常重要,避免野指针
  1. calloc ------ 申请并初始化为 0
cpp 复制代码
int *p = (int *)calloc(4, sizeof(int));

每个字节都置 0。

4. realloc ------ 扩容 / 缩容

cpp 复制代码
p = (int *)realloc(p, 8 * sizeof(int));

四、完整示例:动态数组

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    printf("请输入数组长度:");
    scanf("%d", &n);

    // 动态申请
    int *p = (int *)malloc(n * sizeof(int));
    if (p == NULL)
    {
        printf("申请失败\n");
        return 1;
    }

    // 赋值
    for (int i = 0; i < n; i++)
    {
        p[i] = i + 1;
    }

    // 打印
    for (int i = 0; i < n; i++)
    {
        printf("%d ", p[i]);
    }

    // 释放
    free(p);
    p = NULL;

    return 0;
}

五、动态内存实现可扩容学生管理

结合上一章项目,我们可以实现不限人数的学生管理。

cpp 复制代码
struct Student *stus;
int count = 0;
int capacity = 0;

// 初始化
stus = (struct Student *)malloc(10 * sizeof(struct Student));
capacity = 10;

// 满了就扩容
if (count >= capacity)
{
    stus = (struct Student *)realloc(stus, (capacity + 10) * sizeof(struct Student));
    capacity += 10;
}

六、高频易错点

  1. 不判断 malloc 返回 NULL 直接使用
  2. mallocfree,造成内存泄漏
  3. free 后继续使用,变成野指针
  4. 重复 free 同一块内存
  5. 越界读写动态数组

七、本章总结

  1. 动态内存从上申请,灵活可控
  2. malloc 申请,free 释放,必须成对出现
  3. calloc 会自动清零
  4. realloc 用于扩容
  5. 释放后置空指针,避免野指针
  6. 是实现高性能、灵活项目的必备基础

下期预告

C 语言从 0 入门(十七)|结构体指针 + 动态内存综合实战下一篇我们把结构体、指针、动态内存、文件操作全部融合,打造一个真正可商用的小型管理系统。

相关推荐
晓蛋2 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿2 天前
重载、重写(覆盖)、重定义区别
c语言
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
phltxy2 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
phltxy2 天前
C 语言中的数据存储:从类型到二进制位
c语言
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超2 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust