103.别再死记栈和堆了!3分钟用生活化例子讲透,新手一听就懂,再也不踩坑
一、先讲栈一块有固定规矩的内存区域其实栈就是一块内存区域用起来有固定规矩最核心的特点就是后进先出。说白了你就把它想成家里那一摞盘子最后放上去的那个肯定最先被拿走最早放的那个反倒得等最后才能取。这就是后进先出的意思特别好记程序调用函数跟放盘子的逻辑一模一样举个例子main函数调用A函数A函数又调用B函数那就是main先进栈接着A进来最后B再进来。等程序执行完B最先出栈然后是A最后才回到main一步都不会乱系统会自动帮你理清楚顺序每调用一次函数系统就会在栈上给它划一块专属空间这就是栈帧。这里面会存什么呢很简单函数的参数、局部变量、返回地址还有程序运行时需要的状态信息全在这比如你写个加法函数add参数a、b还有里面的局部变量result全都存在栈帧里不用你手动管。栈的优势栈的好处真的太突出了管理特别简单完全不用你手动操心函数一调用系统自动分配空间函数一执行完系统又自动回收零管理成本新手友好到爆速度贼快因为栈的内存排列得整整齐齐系统只需要调一下指针就能完成分配和释放比堆快多了栈的致命缺点空间有限但栈也有个致命缺点——空间有限要是函数调用的层级太深或者你在函数里创建了特别大的局部变量把栈的空间占满了就会出现栈溢出最常见的就是递归函数要是没写结束条件它就会不停调用自己栈帧越堆越多最后直接报错stack overflow。所以写递归的时候一定要记得加结束条件别踩这个坑二、再讲堆专门用来动态分配内存的区域说完栈咱们再讲堆这里说的堆和栈完全不是一回事它就是程序运行时专门用来动态分配内存的区域。什么时候用堆呢很简单只要你不知道要存的数据有多大或者数据需要长期保存就找堆准没错给你们举两个例子一看就懂场景一文件读取你要读一个文件写代码的时候根本不知道文件有多大这时候就可以根据文件的实际大小从堆里动态申请内存用多少申请多少。场景二跨函数对象一个对象你在这个函数里用完其他函数还得接着用那它就不能放栈里因为函数一结束栈里的数据就被回收了。这时候放堆里就能一直保留着。堆的优势与代价堆最大的优势就是空间大、用起来灵活不管是大块数据还是生命周期不确定的数据都能往堆里放。但灵活归灵活它的管理成本可比栈高多了稍不注意就会出问题就拿C、C来说你用malloc、new申请了堆内存用完之后必须手动用free、delete释放掉不然就会出现内存泄露什么是内存泄露说白了就是这块内存已经没用了你却没还给系统。一次两次可能看不出来问题但程序要是长期运行不停申请内存又不释放内存就会越占越多最后直接崩溃特别麻烦可能有兄弟会说Java、Go这些语言就不用操心了吧确实它们有垃圾回收机制也就是GC不用你手动释放会自动回收那些没用的堆内存。但别觉得就万事大吉了如果你一直留着那些没用对象的引用GC就会误以为它还能用不会回收时间长了内存照样会越占越大还是会出问题三、4点核心区别新手直接抄作业最后给大家总结4点核心区别记好这4点再也不会把栈和堆搞混新手直接抄作业第一管理方式不一样栈系统全权负责自动分配、自动释放你啥都不用管。堆得动态申请C、C需要你手动释放Java、Go这些语言靠GC自动管理相对省心一点但也不能完全不管。第二生命周期不一样栈栈里的数据完全跟着函数走函数执行完对应的栈帧就被销毁数据也没了。堆堆里的数据不一样只要你还保留着它的引用就能一直存在就算跨函数使用也没问题。第三空间大小不一样栈栈的空间比较小就适合存点临时数据比如函数参数、局部变量这些。堆堆的空间就大得多适合存对象、大块数据还有那些生命周期不确定的数据。第四速度不一样栈栈的结构简单内存排列规整分配和释放的速度特别快。堆堆就不一样了系统得找空闲的内存还要处理内存碎片、垃圾回收这些事速度慢管理成本也高。四、大白话总结彻底分清用一句大白话总结大家就能彻底分清栈就像函数的临时工作台空间不大但用起来方便、速度快用完还不用自己收拾系统自动清理。堆就像程序的公共仓库空间大、想怎么用就怎么用但得精心打理不然就容易出问题五、代码示例直观理解为了让大家更直观地理解我准备了几个代码示例覆盖栈溢出、内存泄漏、栈帧和函数调用等场景。示例1栈溢出递归#include stdio.h // 错误示例没有结束条件无限递归导致栈溢出 void infinite_recursion() { printf(递归调用...\n); infinite_recursion(); // 没有结束条件一直调用自己 } // 正确示例有结束条件的递归 int factorial(int n) { if (n 1) { // 结束条件 return 1; } return n * factorial(n - 1); } int main() { // 测试正确的递归 printf(5的阶乘是%d\n, factorial(5)); // 输出120 // 测试错误的递归会导致栈溢出 // infinite_recursion(); // 取消注释运行会报错 stack overflow return 0; }示例2内存泄漏C#include iostream // 错误示例内存泄漏忘记释放堆内存 void memory_leak() { int* ptr new int(42); // 申请堆内存 // 忘记 delete ptr; 函数结束指针丢失内存泄漏 } // 正确示例手动释放堆内存 void no_memory_leak() { int* ptr new int(42); std::cout *ptr std::endl; delete ptr; // 释放堆内存 } int main() { memory_leak(); // 内存泄漏 no_memory_leak(); // 没有内存泄漏 return 0; }示例3栈帧和函数调用C#include stdio.h // 加法函数参数a、b局部变量result都存在栈帧里 int add(int a, int b) { int result a b; return result; } int main() { int x 10; int y 20; int sum add(x, y); // 调用add函数main函数的栈帧里保存了返回地址等信息 printf(sum %d\n, sum); // 输出30 return 0; }示例4堆的使用场景Javapublic class HeapExample { static class Person { String name; int age; public Person(String name, int age) { this.name name; this.age age; } } public static void main(String[] args) { // 对象存在堆里引用存在栈里 Person person new Person(张三, 25); System.out.println(person.name person.age 岁); // 数组存在堆里 int[] numbers new int[1000]; for (int i 0; i numbers.length; i) { numbers[i] i; } } }怎么样是不是一下子就懂了栈和堆其实没那么难只要搞懂它们的本质那些内存相关的报错全都能轻松解决如果这篇文章对你有帮助欢迎点赞、收藏、转发也欢迎在评论区留下你的问题我们一起交流学习

相关新闻

深挖《取子龙首青铜钺》背后隐藏的故事,揭开“邹“字与氏的起源之迷

深挖《取子龙首青铜钺》背后隐藏的故事,揭开“邹“字与氏的起源之迷

故事要从取子龙首青铜钺开始说起 一、取子龙首青铜钺基础鉴定属性(客观文物参数) 取子龙首青铜钺,1980 年出土于今邹城市张庄镇小彦村凤凰山区域,西周早期青铜仪仗礼器,非实战兵器,国家一级文物&#xff0c…

2026/8/21 15:08:56 阅读更多 →
TC397 SCR异常导致SPI通信故障的排查与解决

TC397 SCR异常导致SPI通信故障的排查与解决

1. 问题引入:当TC397的SCR不再“听话” 最近在调试一块基于英飞凌AURIX™ TC397的域控制器板卡时,遇到了一个颇为棘手的问题:系统安全控制寄存器(SCR)的行为出现了异常。具体表现是,在尝试通过SPI总线配置外…

2026/8/21 15:14:43 阅读更多 →
自动售货机智能补货系统:IoT+AI架构设计与工程实践

自动售货机智能补货系统:IoT+AI架构设计与工程实践

1. 项目概述:当自动售货机遇上“闪电补货” 你有没有遇到过这样的场景:在写字楼或者商场里,想从自动售货机买瓶水,结果发现你最爱的那个口味已经售罄,屏幕上只剩下一个灰色的“缺货”图标?对于消费者来说&a…

2026/8/20 14:44:14 阅读更多 →

最新新闻

30分钟做出能直接编辑的AI PPT:PPT Master完整入门指南

30分钟做出能直接编辑的AI PPT:PPT Master完整入门指南

30分钟做出能直接编辑的AI PPT:PPT Master完整入门指南 【免费下载链接】ppt-master AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and animations, data-backed charts and tables on demand, audio narrat…

2026/8/21 17:06:55 阅读更多 →
游戏ISO一键转CHD:tochd完整使用指南,让Linux模拟器玩家告别格式混乱

游戏ISO一键转CHD:tochd完整使用指南,让Linux模拟器玩家告别格式混乱

游戏ISO一键转CHD:tochd完整使用指南,让Linux模拟器玩家告别格式混乱 【免费下载链接】tochd Convert game ISO and archives to CD/DVD CHD for emulation on Linux. 项目地址: https://gitcode.com/gh_mirrors/to/tochd 去年我整理自己的复古游…

2026/8/21 17:06:55 阅读更多 →
网页视频下载总是失败?猫抓资源嗅探插件的完整使用指南

网页视频下载总是失败?猫抓资源嗅探插件的完整使用指南

网页视频下载总是失败?猫抓资源嗅探插件的完整使用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 网页里的视频明明在播放&#x…

2026/8/21 17:06:55 阅读更多 →
Gamdl 完整指南:命令行轻松下载 Apple Music 无损歌曲与 4K 音乐视频

Gamdl 完整指南:命令行轻松下载 Apple Music 无损歌曲与 4K 音乐视频

Gamdl 完整指南:命令行轻松下载 Apple Music 无损歌曲与 4K 音乐视频 【免费下载链接】gamdl A command-line app for downloading Apple Music songs, music videos and post videos. 项目地址: https://gitcode.com/GitHub_Trending/ga/gamdl 月初会员到期…

2026/8/21 17:06:55 阅读更多 →
如何快速给 3DS 换主题和开机动画:Anemone3DS 主题管理工具上手全记录

如何快速给 3DS 换主题和开机动画:Anemone3DS 主题管理工具上手全记录

如何快速给 3DS 换主题和开机动画:Anemone3DS 主题管理工具上手全记录 【免费下载链接】Anemone3DS A theme and boot splash manager for the Nintendo 3DS console 项目地址: https://gitcode.com/gh_mirrors/an/Anemone3DS 如果你的 Nintendo 3DS 已经躺在…

2026/8/21 17:06:55 阅读更多 →
单片机毕设选题推荐:基于 STM32 的自动定时太阳能路灯硬件控制系统开发 基于 STM32 的多档位调光太阳能路灯物联网终端设计(014004)

单片机毕设选题推荐:基于 STM32 的自动定时太阳能路灯硬件控制系统开发 基于 STM32 的多档位调光太阳能路灯物联网终端设计(014004)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/21 17:05:55 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →