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

关于栈和堆:函数调用过程中的内存管理详解

在学习内存管理时栈和堆是两个非常重要的概念。为了更好地理解它们我们先来看一个简单的程序示例。假设我们定义了三个函数a、b 和 c。其中函数 a 内部依次调用了函数 b 和函数 c。在 main 函数中我们调用了函数 a。那么从底层角度来看这个调用过程是如何运行的呢当函数 b 执行完毕后程序又是如何正确地返回到函数 a 中继续执行的要回答这个问题需要了解一个特殊的寄存器——链接寄存器LRLink Register。LR 用于存放函数调用结束后的返回地址。此外每个函数运行时都需要一块内存来保存其局部变量。当我们在 main 函数中调用 a 时LR 会被设置为 main 函数中调用 a 的下一条指令的地址。这样当 a 执行完毕后CPU 就能通过 LR 返回到 main 中继续执行。那么问题来了函数 a 内部又调用了函数 b 和 c。当执行到调用 b 时如果直接把 LR 覆盖为返回到 a 中的某个地址那么之前保存的返回到 main 的地址岂不是丢失了同理再调用 c 时又会覆盖。但实际上程序并不会丢失这些返回地址。真相是这样的当一个函数例如 a未执行完又调用了另一个函数例如 b时系统会在内存中重新开辟一段空间用于存放被调用函数b自己的 LR 以及它的局部变量。而之前未执行完的函数a的那段内存区域仍然存在其中的 LR 等信息被妥善保存不会被覆盖。当 b 执行完毕后系统会根据 b 的 LR 返回到 a 中继续执行然后 a 再调用 c依此类推。当最外层的函数 a 最终执行完时系统会自动释放所有这些内存空间。这段由系统自动分配和销毁的内存就是栈Stack。栈的管理是自动的——函数调用时压入栈帧函数返回时弹出栈帧无需程序员干预。与栈相对的是堆Heap。堆内存需要程序员手动管理在 C 语言中使用malloc来申请在 C 中使用new来申请。申请成功后会返回一块连续内存的起始地址。使用完毕后必须手动释放C 中用freeC 中用delete如果是数组则用delete[]。如果不释放这块内存就会一直占着直到程序结束——这就是“内存泄漏”。如果释放后继续使用则会产生“野指针”错误导致程序崩溃或数据错乱。堆的生存周期完全由你决定栈上的变量在函数返回时自动销毁而堆上的内存可以跨函数存在。例如你在函数 A 中用malloc申请一块内存可以把它的地址返回给调用者甚至传递给其他线程。只要你不调用free它就一直有效。这种灵活性是堆最大的优势。堆的分配原理简版系统并不会每次malloc都直接向操作系统要内存。通常C 运行时库会预先向操作系统申请一大块内存称为堆池然后自己管理这块内存的空闲块。malloc的过程就是从空闲链表中找出一块大小合适的内存返回free则是把这块内存标记回空闲并尽可能合并相邻的空闲块以减少碎片。内存碎片问题由于堆内存的申请和释放可以是任意顺序长时间运行的程序容易产生两种碎片外部碎片总体空闲内存足够但没有一块连续的大块能满足一次大申请。内部碎片你申请了 10 字节但系统因为对齐或最小块限制给了你 16 字节那多出来的 6 字节就浪费了。频繁的malloc/free会加剧碎片最终可能导致大块分配失败。堆和栈的对比速度栈极快仅移动指针堆较慢需要查找空闲块甚至系统调用。大小栈通常较小1~8 MB堆可以很大受物理内存虚拟内存限制。管理方式栈自动堆手动。碎片栈无碎片堆有碎片。适用场景栈适合小数据、生命周期与函数绑定的变量堆适合大块数据、需要跨函数或动态增长的数据。使用堆的几条建议每次malloc后都要检查返回值是否为NULL申请失败。配对写free申请的时候就想好在哪里释放。释放后将指针置为NULL避免野指针误用。尽量用栈代替堆栈更快、无泄漏风险只有确实需要时才使用堆。总结一下栈系统自动分配和回收用于存储函数的返回地址、局部变量等遵循后进先出原则。堆手动开辟和释放生存周期灵活但需要程序员谨慎管理内存。

相关文章:

关于栈和堆:函数调用过程中的内存管理详解

在学习内存管理时,栈和堆是两个非常重要的概念。为了更好地理解它们,我们先来看一个简单的程序示例。假设我们定义了三个函数:a、b 和 c。其中,函数 a 内部依次调用了函数 b 和函数 c。在 main 函数中,我们调用了函数 …...

避开这些坑:GPT-4 API多轮对话与流式输出实战中的5个常见问题

GPT-4 API高阶实战:多轮对话与流式输出的5个关键优化点 当开发者从基础API调用进阶到构建复杂对话系统时,往往会遇到一系列意料之外的挑战。这些挑战不仅影响用户体验,还可能直接导致项目延期或预算超支。本文将深入剖析五个关键优化点&#…...

用Python+ddddocr+Selenium搞定极验滑块验证码(附完整代码和避坑点)

PythonddddocrSelenium实战:极验滑块验证码自动化解决方案 当你在电商平台抢购限量商品时,或者在社交平台批量注册账号时,滑块验证码往往是第一个需要跨越的技术障碍。作为目前最主流的验证方式之一,极验滑块验证码通过动态加载、…...

新手首次在Taotoken平台获取API Key并完成模型调用的全指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手首次在Taotoken平台获取API Key并完成模型调用的全指南 对于初次接触大模型API的开发者来说,从注册平台到成功发出…...

购买ssl 证书注意事项

购买ssl证书前需要搞清楚几个问题,才能选择合适的证书。 一、证书类型选择 SSL证书按验证强度分为DV、OV、EV三种,信任程度和价格也依次递增 证书类型核心特点与信任等级审核与签发适用场景价格参考(年/单域名)DV (域名验证型)基础加密,信…...

告别手动配置!用CMake的CMAKE_TOOLCHAIN_FILE一键搞定嵌入式ARM交叉编译

嵌入式开发者的CMake救星:用CMAKE_TOOLCHAIN_FILE实现ARM交叉编译自动化 从x86平台转向嵌入式开发时,最令人头疼的莫过于交叉编译环境的搭建。每次新建项目都要重复配置arm-none-eabi-gcc路径、设置-mcpucortex-m4编译参数、调整链接脚本——这些机械性工…...

Mac上IDEA里Maven deploy总报401?别急,先检查这两个配置文件是否‘对暗号’

Mac上IDEA里Maven deploy报401?可能是配置文件没"对暗号" 作为Java开发者,在Mac上使用IntelliJ IDEA进行Maven部署时遇到401错误,就像拿着正确的钥匙却打不开门一样令人沮丧。这个错误通常意味着认证失败,但问题往往不在…...

3大终极自动化功能:让你的《崩坏:星穹铁道》体验轻松翻倍

3大终极自动化功能:让你的《崩坏:星穹铁道》体验轻松翻倍 【免费下载链接】StarRailAssistant 崩坏:星穹铁道自动化 | 崩坏:星穹铁道自动锄大地 | 崩坏:星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https…...

手机号码定位系统:基于ASP.NET的开源解决方案深度解析

手机号码定位系统:基于ASP.NET的开源解决方案深度解析 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirr…...

娱乐圈天降紫微星平地起高楼,海棠山铁哥白手搭建影视新高度

海棠山铁哥,以一介素人之身,重写内娱影视规则。“真正的紫微星,从不走别人铺好的路。”一、旧世界:资本筑高墙,素人只可仰望规则结果资本奠基高楼只许巨头盖资源铺路赛道被人脉垄断老牌 IP 坐享红利新人只能蹭情怀喝汤…...

娱乐圈天降紫微星逆势而生,海棠山铁哥在无人看好中登巅峰

逆势而生 紫微星传奇“天降紫微星,从来不是被捧出来的,而是闯出来的。”紫微星的降临,从不是顺境中的锦上添花,而是逆境中的破局而生。 它无关资本堆砌的光环,无关流量炒作的热度,无关圈层人脉的加持&…...

从用量看板观察不同模型调用成本与token消耗规律

从用量看板观察不同模型调用成本与token消耗规律 1. 用量看板的核心功能定位 Taotoken用量看板为团队管理者与开发者提供了多维度的API调用数据可视化能力。该功能通过聚合各API Key下的请求日志,实时统计不同模型的调用次数、输入输出token总量及对应费用消耗。所…...

StreamFX架构深度解析:现代OBS插件框架设计与技术实现

StreamFX架构深度解析:现代OBS插件框架设计与技术实现 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custo…...

如何高效使用开源ZXP安装器:一站式Adobe插件管理解决方案

如何高效使用开源ZXP安装器:一站式Adobe插件管理解决方案 【免费下载链接】ZXPInstaller Open Source ZXP Installer for Adobe Extensions 项目地址: https://gitcode.com/gh_mirrors/zx/ZXPInstaller 还在为Adobe插件安装的繁琐流程而烦恼吗?ZX…...

2026年Hermes Agent/OpenClaw怎么部署?阿里云快速上手及Coding Plan配置教程

2026年Hermes Agent/OpenClaw怎么部署?阿里云快速上手及Coding Plan配置教程。 OpenClaw作为阿里云生态下新一代的开源AI自动化代理平台,曾用名Moltbot/Clawdbot,凭借“自然语言交互自动化任务执行大模型智能决策”的核心能力,正在…...

3分钟搞定Windows激活:KMS_VL_ALL_AIO智能脚本终极指南

3分钟搞定Windows激活:KMS_VL_ALL_AIO智能脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗?KMS_VL_ALL_AIO智能激活脚本为您提…...

智能门锁常用的国产NFC芯片方案解析:从VRC522到433MHz的选型思考

在智能门锁、酒店锁、桑拿柜锁等非接触式读卡装置中,NFC(近场通信)读写芯片几乎是标配。而在国产芯片阵营中,VRC522是一款非常典型的代表。今天我们就以VRC522的规格书为切入点,聊聊这类芯片的核心特性、适用场景&…...

分布式实时系统:原理、调度与工程实践

1. 分布式实时系统概述在汽车电子和航空电子等嵌入式系统中,分布式架构已成为主流设计范式。这些系统由多个电子控制单元(ECU)组成,通过共享总线网络连接传感器和执行器。这种架构带来了显著的工程优势:布线优化:将ECU部署在靠近其…...

2026年Hermes Agent/OpenClaw如何安装?阿里云企业级安装及Coding Plan配置

2026年Hermes Agent/OpenClaw如何安装?阿里云企业级安装及Coding Plan配置 。OpenClaw作为阿里云生态下新一代的开源AI自动化代理平台,曾用名Moltbot/Clawdbot,凭借“自然语言交互自动化任务执行大模型智能决策”的核心能力,正在重…...

企业AI转型停滞?立即下载AISMM模型:2024最新版含行业基准数据库(金融/制造/医疗三套校准参数)

更多请点击: https://intelliparadigm.com 第一章:AI成熟度评估工具:AISMM模型下载 AISMM(Artificial Intelligence Software Maturity Model)是由IEEE标准协会支持的开源AI工程化评估框架,专为组织级AI能…...

低成本超声波传感器智能化改造:基于PIC12F1840的I2C适配板设计

1. 项目概述:用3美元的传感器实现55美元的功能如果你正在捣鼓一个机器人项目,尤其是那种需要全方位感知周围环境的全向移动平台,那么超声波测距传感器多半在你的采购清单上。市面上最常见的选择无非两种:一种是像SRF04这样&#x…...

为Hermes Agent配置自定义大模型供应商Taotoken的流程

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Hermes Agent配置自定义大模型供应商Taotoken的流程 Hermes Agent是一个灵活的AI Agent开发框架,它允许开发者通过配…...

从实验室到产线仅需117天:2026年工业AI规模化落地的5个隐藏加速器(某新能源龙头实战复盘)

更多请点击: https://intelliparadigm.com 第一章:2026年工业AI规模化落地的范式跃迁 传统工业AI部署长期受限于“单点智能、孤岛集成、人工调优”的三重瓶颈。至2026年,范式跃迁的核心标志是:从模型驱动转向**产线原生智能&…...

【IDEA】Maven项目编译路径:模块输出vs继承输出的关键区别

在 IntelliJ IDEA 中,对于 Maven 项目,“继承项目编译输出路径”和“使用模块编译输出路径”的主要区别在于.class文件(编译后的产物)存放的位置以及与 Maven 标准目录结构的兼容性。 简单来说:Maven 项目强烈建议使用…...

别再踩坑了!Node.js调用微信小程序码接口,这个responseType参数不加图片就出不来

Node.js调用微信小程序码接口的避坑指南:为什么responseType参数决定成败 微信小程序码(又称"葵花码")作为连接线上线下的重要入口,在电商、社交、工具类应用中扮演着关键角色。但在Node.js后端生成小程序码的过程中&am…...

为什么我们没用Activiti?数环通iPaaS自研流程引擎的决策复盘

写在前面 每次跟技术同行聊到"我们的流程引擎是自研的"这个话题,对方的第一反应几乎都一样:“为什么不用开源的?Activiti/Camunda不香吗?” 说实话,我们内部当年做这个决策的时候,也纠结了很久…...

三步搞定B站4K大会员视频下载:免费工具bilibili-downloader使用全攻略

三步搞定B站4K大会员视频下载:免费工具bilibili-downloader使用全攻略 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在…...

FPGA新手避坑指南:用Vivado给SRAM和DDR3做时序约束,到底差在哪?

FPGA时序约束实战:SRAM与DDR3的核心差异解析 第一次在Vivado里看到SRAM和DDR3的时序约束代码时,我盯着那些相似的set_input_delay命令发了半小时呆——它们看起来差不多,但直觉告诉我肯定有本质区别。直到在实验室熬到凌晨三点,才…...

大模型MLOps流水线重构全图解(奇点大会首发架构图):从训练到上线压缩至72小时

更多请点击: https://intelliparadigm.com 第一章:大模型时代工程实践:奇点智能大会核心议题 在2024年奇点智能大会上,大模型工程化落地成为贯穿全场的技术主线。与会专家一致指出:模型能力已不再是瓶颈,而…...

番茄小说下载器:打造你的永久数字图书馆,5种格式随心选

番茄小说下载器:打造你的永久数字图书馆,5种格式随心选 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾经遇到过这样的情况:追更的小说突然下架…...