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

C语言函数在调用过程中具体是怎么和栈互动的?

从栈开始的一场C语言探险记 —— C语言函数是如何与栈"共舞"的。

栈的舞步解析

通过一个简单的例子来看看这支"舞蹈":

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);return 0;
}

1. 预备动作(Prologue)

当 main 调用 add 函数时,栈会经历以下步骤:

1. 保存返回地址
2. 保存旧的栈基址(EBP)
3. 设置新的栈基址
4. 为局部变量分配空间

栈的变化就像这样:

栈帧高在哪里,妙~在何处?

栈帧就像俄罗斯套娃:

  1. 每个函数调用都会创建一个新的"套娃"(栈帧)
  2. 每个"套娃"都完美地保存了函数需要的所有信息
  3. 函数返回时,就像拆开套娃一样,优雅地回到上一层

常见的"舞蹈事故"

栈溢出

void recursive() {recursive();  // 无限递归,套娃堆太高就倒了!
}

野指针

int* danger() {int local = 42;return &local;  // 想带走舞伴的电话,但舞会已经结束了
}

最后最后

栈就像是程序的记忆,每一帧都记录着函数执行的关键信息。理解它的工作原理,就像是理解了程序运行的"记忆系统"。

程序栈如人生,层层递进,步步回溯。每一次函数调用都是一次新的冒险,每一次返回都是一次圆满的归来。

本文只是一个粗略的描述,希望能帮助你更简单的理解这个过程,更为细致的讲解也会后续写成文章与大家分享。最后别忘了点赞关注~ 我是旷野,探索无尽技术!

http://www.lryc.cn/news/506303.html

相关文章:

  • 【Java中常见的异常及其处理方式】
  • 如何更新项目中的 npm 或 Yarn 依赖包至最新版本
  • SpringBoot3整合FastJSON2如何配置configureMessageConverters
  • 《Vue3实战教程》2:Vue3快速上手
  • ubuntu 24.04.1安装FTP流程
  • 多功能护照阅读器港澳通行证阅读机RS232串口主动输出协议,支持和单片机/Linux对接使用
  • 5个用于构建Web应用程序的Go Web框架
  • Qt中的异步相关类
  • 浅谈仓颉语言的优劣
  • Linux 显示系统活动进程状态命令 ps 详细介绍
  • scala中正则表达式的使用
  • 数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
  • cocos creator制作2dTop-down游戏(虚拟摇杆、地图加载)
  • SQL Server 批量插入数据的方式汇总及优缺点分析
  • linux上抓包RoCEv2
  • 【机器学习与数据挖掘实战】案例04:基于K-Means算法的信用卡高风险客户识别
  • UDP网络编程套接
  • 期权VIX指数构建与择时应用
  • QT笔记- QClipboard剪切板对QByteArray数据的复制与粘贴
  • Python使用PyMySQL操作MySQL完整指南
  • IAR中如何而将定义的数组放在指定的位置
  • 使用skywalking,grafana实现从请求跟踪、 指标收集和日志记录的完整信息记录
  • Ubuntu 20.04 24.04 双网卡 Bond 配置指南
  • 深度学习之目标检测篇——残差网络与FPN结合
  • 2024-2030全球及中国埋线针行业研究及十五五规划分析报告
  • 穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
  • MES系统工作流的单元测试方案
  • 2.学习TypeScript 编译选项配置
  • 计算机网络之王道考研读书笔记-2
  • 【BUG】记一次context canceled的报错