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

相关推荐
JAVA面经实录9175 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
周杰伦fans6 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
Bat U7 小时前
JavaEE|多线程初阶(七)
java·开发语言
谭欣辰8 小时前
C++ 排列组合完整指南
开发语言·c++·算法
代码中介商8 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
foundbug9999 小时前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab
XDH_CS9 小时前
MySQL 8.0 安装与 MySQL Workbench 使用全流程(超详细教程)
开发语言·数据库·mysql
小短腿的代码世界9 小时前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
小康小小涵9 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python