动态内存管理(c++方向必看)
引言学 C 的时候我一度觉得malloc挺多余——数组不是挺好用吗直到写了个小练习让用户输入一串数字再排序。写完发现卡住了数组长度写多少写 10用户输入 11 个就崩写 1000又嫌浪费万一输入 1001 个呢。关键是到底有几个数字我写代码的时候根本不知道得等程序跑起来才清楚。malloc解决的就是这个运行时再决定要多少内存代价是这块内存从此归你管——用完得free不能越界free完也不能再用。动态内存管理也是学好数据结构的前置知识点。这篇就来讲清楚这几件事。目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.开辟成功和失败的案例3.calloc和realloc3.1calloc3.3realloc1.为什么要有动态内存分配我们已经掌握的的内存开辟方式有int val 20; //在栈空间上开辟四个字节 char arr[10] { 0 }; //在栈空间上开辟10个字节的连续空间但是上述开辟空间的方式有两个特点:1.空间开辟大小是固定的2.数组在申明的时候必须指定数组的长度数组空间⼀旦确定了大小不能调整但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运⾏的时候才能知 道那数组的编译时开辟空间的方式就不能满足了。C语言引入了动态内存开辟让程序自己可以申请和释放空间就比较灵活了。2.malloc和free2.1mallocC语言为我们提供了一个动态内存开辟的函数void* malloc (size_t size);功能向内存的堆区申请一块连续可用的空间并返回指向这块空间的起始地址。1. 如果开辟成功则返回这块空间的起始地址。2.如果开辟失败则返回⼀个 • 返回值的类型是 NULL 指针因此malloc的返回值⼀定要做检查。3.返回值的类型是void* 所以malloc函数并不知道开辟空间的类型具体在使⽤的时候使⽤者自己来决定。4. 如果参数 size 为0malloc的行为是标准是未定义的取决于编译器2.2freeC语言提供了一个用于做动态内存的释放和回收的函数freevoid free (void* ptr);free函数用来释放动态开辟的内存就像一个图书馆不能一直借书但是从来不还书这样会出问题的malloc和free都声明在stdilb.h头文件中。如果参数ptr指向的空间不是动态开辟的那函数free的行为是未定义的。如果参数ptr是NULL指针则函数什么都不需要做。3.开辟成功和失败的案例#includestdio.h #includestdlib.h int main() { int* p (int*)malloc(20);//在堆区上申请20个字节的空间 if (p NULL) { perror(use malloc); return 1; } //使用空间 int i 0; for (i 0; i 5; i) { p[i] i 1; } //释放内存 free(p); return 0; }当程序指向完free这一行我们使用malloc开辟的内存就被回收掉了但是当我们把地址还掉之后p还指向原来的地址此时的p就是野指针这个时候给他一个空指针可以了就像给野狗套上铁链子。当我们把编译器环境从x64改成x86并且在malloc中输入特别大的数字动态内存的开辟就有可能失败错误信通过perror函数打印出来。3.calloc和realloc3.1callocC语言还提供了一个函数calloccalloc也能用来动态内存分配void* calloc (size_t num, size_t size);函数的功能是为num个⼤⼩为size的元素开辟⼀块空间并且把空间的每个字节初始化为0与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0。int main() { int* p (int*)calloc(5, sizeof(int)); if (p NULL) { perror(use malloc); return 1; } //使用空间 int i 0; for (i 0; i 5; i) { p[i] i 1; } //释放内存 free(p); p NULL; return 0; }malloc和calloc仅仅在初始化上有区别其他方面是没有区别的。3.3reallocrealloc的出现使得动态内存管理更加灵活有时我们会觉得内存过小不够用有时候内存过大又会产生浪费为了更合理的使用内存我们会对内存的大小做灵活调整realloc就可以做到对动态开辟内存大小的调整。void* realloc (void* ptr, size_t size);功能重新调整之前分配的内存块的大小它可以在不丢失原有数据的情况下扩大或缩小动态分配的内存块。参数ptr是要调整的内存空间的起始地址如果ptr是NULl指针realloc函数的功能类似于malloc函数。size调整之后新大小单位是字节。返回值成功:返回一个指向重新分配的内存块的void*类型指针。这个指针可能与原来的指针不同。失败:如果内存重新分配失败返回 NULL并且原来的内存块保持不变。int main() { int* p (int*)calloc(5, sizeof(int)); if (p NULL) { perror(use malloc); return 1; } //使用空间 int i 0; for (i 0; i 5; i) { p[i] i 1; } //希望空间能放10个整形 int* ptr realloc(p, 10 * sizeof(int)); if (ptr NULL) { perror(use realloc); return 1; } else { p ptr;//继续使用p来维护空间 } //继续使用 for (i 5; i 10; i) { p[i] i 1; } free(p); p NULL; return 0; }注意这里不能直接使用p来接收realloc的结果因为p本身就指向了一块空间如果realloc开辟失败那么p直接被置为NULL了所以我们可以先创建一个ptr来接收待确认空间开辟成功再让p接收。使用realloc调整空间存在两种情况1.原有的空间后有足够大的空间此时拓展内存就直接在原有内存之后直接追加内存原来空间的数据不发生变化2.当原有空间之后没有足够多的空间时扩展的方法是在堆空间另找一个合适大小连续的空间来使用并返回新的地址原来空间中存放的数据会复制过来随后旧空间就释放掉了。旧空间”我免费了“free因为篇幅原因动态内存暂时就写到这下一篇会把常见的动态内存错误一些经典的面试题柔性数组等知识点讲清楚。再次感谢各位码友的观看祝我们都能实现自己的理想

相关新闻

STM32F103国产替代实战:GPS定位平台MCU替换与串口移植解析

STM32F103国产替代实战:GPS定位平台MCU替换与串口移植解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:37:48 阅读更多 →
用动画重建线性代数直觉:向量、矩阵与空间变换的视觉本质

用动画重建线性代数直觉:向量、矩阵与空间变换的视觉本质

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:37:48 阅读更多 →
程序员桌面美化指南:Wallpaper Engine动态壁纸精选与性能优化实践

程序员桌面美化指南:Wallpaper Engine动态壁纸精选与性能优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 17:37:48 阅读更多 →

最新新闻

YOLOv8漆面缺陷检测实战:工业产线级部署指南

YOLOv8漆面缺陷检测实战:工业产线级部署指南

简介:本资源是一套面向高校计算机、人工智能及相关专业学生的毕业设计级项目,聚焦汽车制造场景中的漆面缺陷智能检测问题,基于YOLOv8实现端到端目标检测系统,覆盖数据标注、模型训练、可视化评估与轻量部署全流程。资源共97个文件…

2026/10/2 18:21:11 阅读更多 →
Spring AI多模型多Agent平台实战:从接入路由到RAG落地避坑

Spring AI多模型多Agent平台实战:从接入路由到RAG落地避坑

简介:Snail AI 是一套基于 Spring Boot 4 与 Spring AI 构建的企业级 AI 智能体平台,面向需要多模型接入与智能体编排的 Java 开发者及企业团队,适用于知识库问答、智能客服、自动化任务等场景。平台开箱即用地提供 RAG 知识库、长期记忆、技…

2026/10/2 18:21:11 阅读更多 →
OpenCV全景拼接实战:从特征匹配到多频带融合

OpenCV全景拼接实战:从特征匹配到多频带融合

简介:本资源是一个基于OpenCV实现的Python全景图像拼接系统,面向计算机视觉初学者、图像处理课程设计者及AI方向实践开发者,解决多视角图像自动对齐、特征匹配与无缝融合等核心问题。压缩包共33.26MB,包含完整可运行源码、配置文件…

2026/10/2 18:21:11 阅读更多 →
免授权单页站群源码部署与关键词排名实战指南

免授权单页站群源码部署与关键词排名实战指南

简介:搜索引擎优化(SEO)站群系统免授权版源码包,面向需要批量建设站群、提升关键词排名的站长与开发者。程序支持多域名绑定同一目录和数据库,每个站点呈现不同单页内容,配合自动组词、全自动生成单页及自定…

2026/10/2 18:21:11 阅读更多 →
Trae AI 插件文档生成:如何自动生成技术文档

Trae AI 插件文档生成:如何自动生成技术文档

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 18:21:11 阅读更多 →
基于CNN的人脸识别考勤系统:预训练模型快速落地与避坑指南

基于CNN的人脸识别考勤系统:预训练模型快速落地与避坑指南

简介:这份资源是一套可直接运行的CNN人脸识别考勤系统,面向深度学习入门者、课程设计或毕业设计开发者,帮助快速搭建从人脸采集到考勤记录落地的完整方案。压缩包共4848个文件,以4835张jpg人脸图像构成训练与测试数据集&#xff0…

2026/10/2 18:20:11 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →