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

相关推荐
qq_4221525719 分钟前
Word 文件太大怎么压缩?2026 年文档瘦身方案对比
开发语言·c#·word
charliedev23 分钟前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他
ji1985944337 分钟前
MATLAB 求散点曲线斜率
开发语言·算法·matlab
kaikaile199542 分钟前
MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)
开发语言·算法·matlab
love_muming44 分钟前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
weixin_446260851 小时前
LLM智能体在社交模拟中的决策行为分析:有限状态与LLM-based策略对比研究
开发语言·php
牛肉在哪里1 小时前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
玖玥拾1 小时前
C/C++ 数据结构(二)双向链表
c语言·数据结构·c++
dnbug Blog1 小时前
C 程序基本结构
c语言·程序结构
techdashen1 小时前
Cargo 1.94 开发周期全解析
开发语言·后端·rust