前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >函数调用的时候为什么会出现栈溢出,看漫画理解背后的原理

函数调用的时候为什么会出现栈溢出,看漫画理解背后的原理

原创
作者头像
阑梦清川
发布于 2025-05-16 09:31:51
发布于 2025-05-16 09:31:51
840
举报
文章被收录于专栏:学习成长指南学习成长指南

今天,大川和小川再次见面,他们开始交谈起来:

fig:
fig:

计算机组成原理作为408里面的难度的天花板,虽然这个分数不是最多的,但是对于很多的考研学子都觉得苦不堪言,尤其是对于软件工程这个专业的学生而言,因为这个专业的学生对于软件的接触很多,但是对于硬件的了解很少,对于汇编语言,编译原理,数字电路这些课程都是没有接触的,因此这个学习的过程就显得非常的吃力;

今天我们会从函数的调用开始引入,逐步的了解这个过程,弄清楚为什么会出现栈溢出,背后的原理是什么;

fig:
fig:

栈溢出的英文名字叫做stackoverflow,stack就是我们的数据结构与算法这门课程里面学习的这个栈这个数据结构,基本的规则就是后进先出,overflow就是溢出的意思,互联网上面有一个非常大的编程交流社区就是使用的这个名字作为该社区的名字,不知道大家听说过没有;

fig:
fig:

下面的这个是关于这个代码的汇编结果,通过这个,可以帮助我们进行这个底层的更好的理解:

fig:
fig:

我们在学习这个C语言的时候一定听说过一句经典的话,就是形参的修改是不会影响实参的,形参是实参的临时拷贝,这个主要的原因就是我们的main函数调用新的自定义函数的时候,创建了新的函数栈帧,因此我们的实参的具体的数值就会被拷贝一份,交给,放到我们的新的函数栈帧里面去了;

所以,这个过程实际上形参的修改是不会影响我们的实参的,因为他们在我们的函数栈帧里面的区域不一样,归属的栈帧也不是同一个,两个函数有自己独立的栈帧,形参和实参在各自的函数栈帧里面,所以这个形参的修改只会影响调用的自定义函数的栈帧里面的情况,对于我们的主函数这个函数栈帧里面的实参的具体数值大小是完全没有任何的这个影响的;

fig:
fig:

我们通过下面的这个例子,理解一下这个过程:

fig:
fig:
fig:
fig:

看到这里,我们就需要提一下这个栈溢出了,怎么说呢,就是我们上面的例子是只有一个 函数的调用,如果是A调用B,B调用C,C调用D,这样的连续的调用,是不是需要把每一次需要执行的下一个指令的地址记录下来;

所以这个时候就从我们的内容里面单独划分一个下的区域作为栈区,专门去存放这个下一个指令的地址;

fig:
fig:

接下来,他们聊到了合格内联函数的相关的内容,感兴趣的同学可以了解一下,也是性能优化的一个方面:

fig:
fig:

内联函数具体优化了什么,具体是如何进行这个相关的操作的:

fig:
fig:

什么样的函数适合作为内联函数,什么样的函数不适合作为内联函数:

fig:
fig:
fig:
fig:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
java数据结构与算法-思维导图
因为最近在学习数据结构与算法相关的知识,所以打算通过写笔记的方式加强自己对数据结构与算法的理解,也是为了方便以后复习。这里整理记录了一份数据结构与算法的思维导图,也是为了以后学习更有方向性。
李林LiLin
2020/09/26
1.1K0
如何学习数据结构与算法
什么是数据结构?什么是算法? 从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。 从狭义上讲,也就是我们专栏要讲的,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题。因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分方法。
Jingbin
2019/04/19
4260
为啥学习数据结构和算法
基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。
acc8226
2022/05/17
1710
数据结构和算法
10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
分母为零
2019/12/04
5780
【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!
比如 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。公司只能考察他们的基础知识是否牢固。社招就更不用说了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。相比短期能力,他们更看中你的长期潜力。
计算机魔术师
2023/12/05
1940
一位算法工程师的自我修养
数据结构与算法 基本算法思想 动态规划 贪心算法 回溯算法 分治算法 枚举算法 算法基础 时间复杂度 空间复杂度 最大复杂度 平均复杂度 基础数据结构 数组 动态数组 树状数组 矩阵 栈与队列 栈 队列 阻塞队列 并发队列 双端队列 优先队列 堆 多级反馈队列 线性表 顺序表 链表 单链表 双向链表 循环链表 双向循环链表 跳跃表 并查集 哈希表(散列表) 散列函数 碰撞解决办法: 开放地址法 链地址法 再次哈希法 建立公共溢出区 布隆过滤器 位图 动态扩容 树 二叉树: 各种遍历,递归与非递归 二
攻城狮Chova
2022/01/22
4770
Java面试考点4之数据结构
复杂度是衡量算法好坏的标准之一,我们需要掌握计算算法时间复杂度和空间复杂度的方法。计算时间复杂度的方法一般是找到执行次数最多的语句,然后计算语句执行次数的数量级,最后用大写 O 来表示结果。
马拉松程序员
2022/04/26
4610
Java面试考点4之数据结构
聊聊数据结构和算法
其实笔者也是一样的,因为算法这个东西,平常真的实操的并不多,但是它又是面试必须问的知识点。因为它是程序员的基础知识。
35岁程序员那些事
2022/09/23
4170
JS中的数据结构——链表(Linked-list)详解
其实链表和数组各有千秋,都在不同的业务场景中发光发热,很多同学对链表可能是既熟悉又陌生。熟悉的是,我们在刷一些八股文的时候经常会看到“链表”这个字眼,陌生的是,我们在平时的开发中并不会太多的使用到链表。
玖柒的小窝
2021/12/06
3.3K0
JS中的数据结构——链表(Linked-list)详解
算法学习笔记
这是一个算法题目合集,题目是我从网络和书籍之中整理而来,部分题目已经做了思路整理。问题分类包括:
芋道源码
2018/12/29
1K0
数据结构与算法必备的 50 个代码实现
数据结构和算法是程序员的内功心法和基本功。无论是人工智能还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少!今天给大家推荐一份不错的数据结构与算法资源。特点是:全代码实现!
红色石头
2022/01/12
7110
数据结构与算法必备的 50 个代码实现
数据结构与算法之美读书笔记
栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。(特定的数据结构是对特定场景的抽象)
_春华秋实
2023/08/28
2960
01数据结构与算法总览_pythoner学习数据结构与算法系列
可以简单理解为: 当一个一维的链表的分叉有两个的时候, 它就变成了一个二维的数据结构,相当于树结构
诡途
2020/10/16
4100
01数据结构与算法总览_pythoner学习数据结构与算法系列
算法笔记汇总精简版下载_算法与数据结构笔记
10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态 规划、字符串匹配算法。
全栈程序员站长
2022/09/20
9490
数据结构与算法入门手册
图片 第一部分:算法概述 算法定义:一系列解决问题的清晰易行的步骤和规则。以编程实现,输入为问题实例,输出为问题解。 算法特征:输入、输出、有穷性、确定性、可行性。算法必须有清晰的输入与输出,步骤必须能在有限时间内结束,为任意输入都可以给出解,并且解得出的结果是正确的。 算法类族:递归算法、迭代算法、确定算法、非确定算法、Exact算法、Heuristic算法等。递归算法通过递归解决子问题,迭代通过循环;确定算法对每组输入都给出同样的输出,非确定算法输出随输入变化。Exact算法可以给出最优解,Heuri
疯狂的KK
2023/05/23
5890
数据结构与算法入门手册
程序员必须掌握的算法有哪些?谈谈这这几年学过的算法
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
帅地
2019/10/23
3.6K0
数据结构与算法系列之总篇
不知何时起,江湖上出现了一个门派,名曰“计算机技术”。其以功法多样、内功高深以及有教无类而闻名江湖。各路侠客,闻名而至。然,多数人只热衷于功法,而畏怯其内功难度,避而不修。殊不知,功法和内功乃相辅相成。。。
尜尜人物
2020/01/15
4060
数据结构与算法系列之总篇
前端需要加强练习的算法
前端开发者在提升技能和面对技术面试时,了解和练习一些算法和数据结构是非常有益的。以下是一些前端开发者可以练习的常见算法和数据结构:
用户10781437
2023/10/10
1680
深入理解算法与数据结构
算法和数据结构是计算机科学中的核心概念,它们贯穿了软件开发的方方面面。在本文中,我们将深入探讨一些重要的算法和数据结构,包括排序、双指针、查找、分治、动态规划、递归、回溯、贪心、位运算、深度优先搜索(DFS)、广度优先搜索(BFS)以及图算法。通过理解这些概念和技巧,您将能够更好地解决各种计算问题,提高编程技能,并准备好面对编程挑战。
海拥
2023/09/15
2510
深入理解算法与数据结构
花了整整两周,小灰肝出一份算法路线图!
对于我们程序员来说,数据结构和算法是必须要掌握的内功。网络上有很多人整理过编程学习的路线图,但是有关数据结构和算法的却并不多。
小灰
2022/02/24
5190
花了整整两周,小灰肝出一份算法路线图!
推荐阅读
相关推荐
java数据结构与算法-思维导图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档