当前位置: 首页 > news >正文

【C语言学习笔记】动态内存分配:malloc/free的正确打开方式

今天在C语言学习中,终于搞懂了动态内存分配的核心用法——用 malloc 和 free 在堆上灵活管理内存。这篇笔记记录一下实操过程和踩坑点~

 

一、为什么需要动态内存?

 

普通数组的大小是编译时确定的(比如 int arr[5] ),但实际开发中经常需要“按需分配内存”——这时候就需要 malloc 在堆区动态申请空间。

 

二、代码实操:用malloc实现动态数组

 

直接上今天写的示例代码(带详细注释):

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

 

int main()

{

    int n = 5;

    // 1. 申请n个int大小的内存(堆区)

    int* p = (int*)malloc(n * sizeof(int)); 

    // malloc返回void*,需强转为对应类型指针

 

    // 2. 检查内存是否申请成功

    assert(p != NULL); // 调试阶段用assert快速排查

    if (p == NULL) // 实际项目中建议用if处理(避免程序直接崩溃)

    {

        printf("开辟内存失败\n");

        return -1;

    }

 

    // 3. 使用动态内存:赋值+打印

    for (int i = 0; i < n; i++)

    {

        *(p + i) = i + 1; // 等价于p[i] = i+1

    }

    for (int i = 0; i < n; i++)

    {

        printf("%d ", *(p + i));

    }

    printf("\n"); // 输出:1 2 3 4 5

 

    // 4. 释放内存+避免野指针

    free(p); // 必须释放堆内存,否则内存泄漏

    p = NULL; // 释放后将指针置空,防止后续误操作

 

    return 0;

}

 

 

三、关键知识点总结

 

1. malloc的用法:

- 语法: void* malloc(size_t size) ,参数是“要申请的字节数”

- 注意:必须计算正确大小(比如 n * sizeof(int) ,不能直接写 n )

2. 内存检查的必要性:

-  malloc 可能失败(返回 NULL ),所以必须用 if 或 assert 判断

- 调试用 assert ,实际项目用 if ( assert 在Release模式会失效)

3. free的注意事项:

- 只能释放动态申请的内存(栈上的局部变量不能用 free )

- 释放后必须将指针置空(否则指针变成“野指针”,指向已释放的内存)

 

四、踩坑提醒

 

- 不要忘记计算 sizeof :比如 malloc(n) 会导致内存不足(因为 int 占4字节)

- 不要重复free:同一个指针被free多次会导致程序崩溃

- 不要操作已free的指针:野指针的操作是未定义行为(可能崩溃、可能输出乱码)

 

今天的学习让我明白:动态内存是C语言的“双刃剑”——灵活但容易出错,必须严格遵守规范~

http://www.dtcms.com/a/601105.html

相关文章:

  • HOVER:用于人形机器人的多功能全身神经控制器
  • 学会给网页穿衣服——学习 CSS 语言
  • Android11-Launcher3 定制-去除副屏幕-可以滑动效果 - 篇二
  • 在 ubuntu怎么创建一个新用户,并且设置为默认自动登录用户,最简单
  • 字符串的陷阱与艺术——std::string全解析
  • 深信服云桌面有什么替代方案?
  • 网页制作与网站建设试卷及答案wordpress 默认文章形式
  • 企业为什么要建立自己的网站云南工程建设信息网站
  • Dubbo如何使用Nacos做注册中心的
  • 决策树悲观错误剪枝(PEP)详解:原理、实现与应用
  • 外卖项目 day01
  • 前端vue3 window.open 项目部署后页面404解决办法
  • pc网站 手机网站 微信网站 上海跨境电商官方网站建设
  • Windows 10 C语言编译器安装与配置
  • 网站后台进不去的原因挂机宝做php网站吗
  • Java I/O模型演进 — BIO、NIO与AIO的原理与实战
  • Flutter---泛型
  • 小米Java开发200道面试题及参考答案(上)
  • 【实战】如何优雅的在Win11/10系统下运行Rust编写的binwalk v3.1.1
  • 网站建设费可以计入管理费用吗手机网站开发利用流程
  • MySQL进阶学习笔记:从单表查询到多表关联的深度解析(万字详解)
  • docker一键部署PDF免费工具箱stirling-PDF
  • CI/CD工具Arbess,从安装到入门零基础教程
  • PG预写式日志解码的艺术与应用
  • 通过Swift CSP评估提高金融安全
  • 高可用与高性能数据库配置实践分析(pgSql clickhouse)
  • android sharepreference 的替代品
  • 网站流量分成营销型网站5要素
  • 科技向暖,银发无忧:十五五规划中智慧养老的温度革命
  • UE5 的 Waterline Pro 6的浮力作用机制解析