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

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

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

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

目录

一、本章学习目标

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

三、四个核心函数

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

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

四、完整示例:动态数组

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

六、高频易错点

七、本章总结

下期预告

一、本章学习目标

  1. 理解栈内存与堆内存的区别
  2. 掌握 malloc 动态申请内存
  3. 掌握 free 释放内存,避免内存泄漏
  4. 理解 calloc 与 malloc 的区别
  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. 只 malloc 不 free,造成内存泄漏
  3. free 后继续使用,变成野指针
  4. 重复 free 同一块内存
  5. 越界读写动态数组

七、本章总结

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

下期预告

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

相关推荐
程序猿追4 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓4 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播4 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
Navigator_Z4 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
himobrinehacken5 小时前
取模运算的汇编奥秘揭秘
c语言·安全
墨云安全5 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠5 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y5 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
jimy17 小时前
c++的 Type Traits (一)
开发语言·c++
Web极客码7 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python