【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 )

  1. 内存检查的必要性:
  • malloc 可能失败(返回 NULL ),所以必须用 if 或 assert 判断

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

  1. free的注意事项:
  • 只能释放动态申请的内存(栈上的局部变量不能用 free )

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

四、踩坑提醒

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

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

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

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

相关推荐
tb_first13 分钟前
万字超详细苍穹外卖学习笔记5
java·数据库·spring boot·笔记·学习·spring
Horizon_Ruan16 分钟前
从零开始掌握AI:LLM、RAG到Agent的完整学习路线图
人工智能·学习·ai编程
小柯博客17 分钟前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(六)
c语言·git·stm32·单片机·嵌入式硬件·开源·yocto
im_AMBER17 分钟前
Leetcode 113 合并 K 个升序链表
数据结构·学习·算法·leetcode·链表
rainbow72424418 分钟前
系统学习AI的标准化路径,分阶段学习更高效
大数据·人工智能·学习
山岚的运维笔记23 分钟前
SQL Server笔记 -- 第16章:MERGE
java·笔记·sql·microsoft·sqlserver
£漫步 云端彡31 分钟前
Golang学习历程【第十三篇 并发入门:goroutine + channel 基础】
开发语言·学习·golang
AutumnorLiuu37 分钟前
C++并发编程学习(二)—— 线程所有权和管控
java·c++·学习
sinat_2676119144 分钟前
跟着官网学习协程随笔
学习·kotlin
童话名剑1 小时前
语音识别 与 触发词检测(吴恩达深度学习笔记)
笔记·深度学习·语音识别·触发词检测