C语言中的动态内存分配
在很多场景数据的大小是在运行时才能确定编译阶段无法确定数据长度或者有大块的数据需要存放但是栈空间不够或者某些参数需要实现跨函数传递或者需要实现可变的数据结构。当面临这些问题时我们往往想到动态分配内存。本文将主要讲在C语言中动态内存分配的4个常用函数以及使用注意事项。一、为什么要用动态内存栈内存存放局部变量大小编译期确认空间很小通常只有几MB函数结束自动销毁堆内存空间大动态分配大小运行时确定但是必须手动管理原因1【主要原因】运行时才知道需要多大内存静态数组写大了浪费内存写小了会溢出动态内存要多少给多少例如用户输入、读取文件、网络接收的数据程序跑起来才知道要多少数据没有办法提前写死。原因2突破栈空间限制栈空间很小一般就1-8MB左右大数据不能放在栈上必须放到堆。原因3内存生命周期不受函数作用域限制栈上的局部变量函数执行完毕就自动释放了不能继续函数外使用动态内存函数结束堆内存依然存在必须手动free才释放eg局部数组函数返回后内存销毁返回指针就是也指针原因4实现可边长数据结构链表、队列、树、哈希表全部离不开动态内存。链表每新增一个节点就要malloc一块内存节点没有动态内存就写不出链表二、四种常用动态内存函数1、四种对比函数参数内存初始化功能mallocmalloc(字节数)不初始化垃圾值分配指定大小堆内存calloccalloc(元素个数每个大小)全部置0分配数组自动清零reallocrealloc(旧指针新总字节)旧数据保留新增部分不初始化修改已分配内存大小扩容缩容freefree指针-释放堆内存malloc和realloc分配的空间生存期是随进程持续性不是随代码块持续性。2、malloc作用分配X字节的堆内存不会初始化内存里面为随机值。分配成功返回内存首地址分配失败返回NULL#includestdio.h#includewindows.h#includemath.hintmain(){SetConsoleOutputCP(65001);SetConsoleCP(65001);//在堆上申请10个连续int内存空间int*p(int*)malloc(10*sizeof(int));if(pNULL){printf(动态内存分配失败\n);}else{printf(动态内存分配成功\n);for(inti0;i10;i){printf(%p,存放的内容%lx\n,p[i],p[i]);}}free(p);//用完释放pNULL;// 置空防止野指针return0;}运行结果malloc分配的内存不会自动初始化所有元素默认是随机垃圾值使用前建议手动赋值。3、calloccalloc(num,size)作用分配num个元素每个占用size字节分配完成自动全部初始化为0和malloc的区别calloc会清零malloc不会。//上面的malloc变为callocint*p(int*)calloc(10,sizeof(int));运行结果4、reallocrealloc(ptr,new_size)作用重新修改已分配好的堆内存扩容或缩容ptr:之前得到的指针newsize新的总字节数注意如果后面堆空间足够直接原地扩容返回原来的地址如果后面不够堆找一块全新内存把旧内容复制过去释放旧内存返回新地址失败返回NULL原来旧内容不会释放realloc(ptr,0):长度为0是把原来的空间释放#includestdio.h#includewindows.h#includemath.hintmain(){SetConsoleOutputCP(65001);SetConsoleCP(65001);//在堆上申请10个连续int内存空间,并将内存的首地址赋值给整型指针pint*p(int*)calloc(5,sizeof(int));int*tmp(int*)realloc(p,10*sizeof(int));if(pNULL){printf(动态内存分配失败);}else{printf(-----动态内存分配成功-----\n);for(inti0;i5;i){printf(%p,存放的内容%lx\n,p[i],p[i]);}if(tmp!NULL){printf(-----重新分配成功-----\n);ptmp;for(inti0;i10;i){printf(%p,存放的内容%lx\n,p[i],p[i]);}}else{printf(-----重新分配失败-----\n);//分配失败p仍指向旧内存可以继续使用printf(%p\n,p);}}free(p);//用完释放pNULL;// 置空防止野指针return0;}运行结果注意realloc直接用原指针接收返回值失败会导致内存泄漏例子中直接写prealloc(p,newsize);如果失败p被赋值为NULL原内存地址丢失直接内存泄漏。realloc(NULL,n)等价于malloc(n)5、free释放内存作用释放堆内存还给操作系统规则参数必须是malloc、realloc、calloc返回的地址不能传栈变量地址free之后原来的指针变量仍然保存旧地址变为野指针建议手动赋值为NULL不能重复free同一个指针程序会崩溃free(NULL)是安全的什么都不做三、使用注意事项1、实际项目大量使用动态内存malloc、realloc、calloc、free但是不能无脑使用滥用会付出巨大代价内存泄漏忘记free程序越跑内存占用越高长期运行服务直接卡死。野指针free之后继续使用重复free直接崩溃realloc坑点分配失败处理麻烦频繁malloc、free会产生内存碎片长时间运行内存效率下降所以小固定大小缓冲区优先栈数组不要mallocmalloc和free尽量配对谁申请谁释放嵌入式设备内存很小尽量少用动态内存必要时禁止malloc2、垃圾内存/内存泄漏char*pmalloc(10);chara;pa;//p本来指向10字节的动态内存分配的空间现在指向a上述代码没有任何指针会指向那段动态内存分配的空间并且那段空间不会释放变为垃圾内存或说内存泄漏解决办法方案一p指向其他对象之前先释放free(p);pa;方案二p指向其他对象之前给那段空间找一个索引指针char*qp;//后面可以通过q来释放这段空间。pa;

相关新闻

无名杀网页版:3分钟开启你的免费三国杀之旅

无名杀网页版:3分钟开启你的免费三国杀之旅

无名杀网页版:3分钟开启你的免费三国杀之旅 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 还在为复杂的游戏安装流程而烦恼吗?想要随时随地享受经典的三国杀对决却受限于设备?无名杀网页版正是你…

2026/10/16 4:59:39 阅读更多 →
zabbix企业级监控平台4——分布式监控与grafana数据可视化

zabbix企业级监控平台4——分布式监控与grafana数据可视化

1 分布式监控 1.1 简介 Zabbix 分布式依靠 Zabbix Proxy 实现分层采集,分为三层: Zabbix Server(中心服务端):统一存储数据、展示图表、告警、配置下发(唯一数据库)Zabbix Proxy(分布…

2026/10/19 15:42:56 阅读更多 →
3分钟极速部署:Hermes WebUI Docker容器化完整指南

3分钟极速部署:Hermes WebUI Docker容器化完整指南

3分钟极速部署:Hermes WebUI Docker容器化完整指南 【免费下载链接】hermes-webui Hermes WebUI: The best way to use Hermes Agent from the web or from your phone! 项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui 想在几分钟内拥有一个…

2026/10/16 5:11:57 阅读更多 →

最新新闻

IM系统用户管理子服务架构设计与踩坑实践:从表结构到缓存策略

IM系统用户管理子服务架构设计与踩坑实践:从表结构到缓存策略

做IM系统,用户管理子服务往往是看起来最简单、坑却最多的那一块。很多人一开始会觉得,无非就是注册、登录、改个昵称、拉个好友列表,有什么好写的?但真正上手做才发现,一个IM系统里最基础的用户服务,牵扯到…

2026/10/19 22:03:35 阅读更多 →
DUT-OMRON数据集上的U-Net二值分割实战:边缘鲁棒与工业落地

DUT-OMRON数据集上的U-Net二值分割实战:边缘鲁棒与工业落地

简介:本资源是一套面向深度学习初学者与图像分割实践者的Unet多尺度分割实战项目,聚焦二值图像分割任务,特别适配DUT-OMRON数据集的端到端训练与推理需求。压缩包共2000个文件,主体为1979张PNG格式的训练/测试图像及对应mask&…

2026/10/19 22:03:35 阅读更多 →
XXE漏洞剖析:从XML外部实体注入到文件读取与SSRF防御

XXE漏洞剖析:从XML外部实体注入到文件读取与SSRF防御

大概在五年前做某次授权测试,目标系统有个不起眼的文件上传接口,响应报文里带着一段 XML 结构。当时随手改了改请求体,把实体声明换成了外部实体,结果直接把服务器上的/etc/passwd读了出来。那是我第一次真正意识到 XXE&#xff0…

2026/10/19 22:02:34 阅读更多 →
编译通过≠代码健康:C++静态检测原理与工具落地指南

编译通过≠代码健康:C++静态检测原理与工具落地指南

编译通过不等于代码健康:C静态检测到底在查什么我做C开发这些年,越来越觉得一个道理:编译器不报错,只是说你的代码符合语法和类型规则,它压根不关心你的逻辑是不是对的、指针是不是悬空的、资源有没有泄漏。很多问题要…

2026/10/19 22:02:34 阅读更多 →
基于Prometheus的MySQL自适应优化系统:从手工调参到自动闭环

基于Prometheus的MySQL自适应优化系统:从手工调参到自动闭环

1. 起因:静态参数与动态负载之间的拧巴 我维护的一套订单查询系统,跑在两个8C16G的实例上,平时QPS稳定在两千左右,配置也自认为调得“差不多了”。某天凌晨两点多,告警平台连续弹了三条: Threads_connecte…

2026/10/19 22:01:31 阅读更多 →
基于Python实现可靠数据传输协议:从停等到滑动窗口的完整课设指南

基于Python实现可靠数据传输协议:从停等到滑动窗口的完整课设指南

简介:这是计算机网络课程设计场景下的一份Python实现资源包,围绕UDP设计可靠数据传输协议,完整覆盖停等协议、GBN和SR的改进思路。内容对应实验要求,包括单向可靠传输、丢包模拟、双向数据传输以及基于协议的C/S文件传输应用&…

2026/10/19 22:01:31 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →