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

相关推荐
1024奇点8 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch9 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL9 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0310 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
蹊黎10 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
by2099910 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮11 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻11 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble11 小时前
C++ 用互斥锁实现读写锁
开发语言·c++