-
-
[原创]深入理解C语言一-函数调用流程
-
发表于: 2021-7-1 18:02 5735
-
栈是一种用来存储逻辑关系为一对一数据的线性存储结构,需要注意的是,栈只能从表的一端存取数据,另一端是封闭的。在栈中,存取数据必须遵循先进后出的原则,即最先进栈的元素最后出栈。栈的开口端被称为栈顶,封口端被称为栈底。
进栈:向栈中添加数据。
出栈:从栈中提取出指定元素。
一个函数(调用者caller)调用另一个函数(被调用者callee),使用栈结构记录函数之间的调用关系,便于函数执行结束后,确定执行流程的出口。
1、按照调用约定传参,保存参数(约定传参的顺序、约定参数的存储媒介、约定释放参数空间者、约定返回值的存储媒介)。
2、保存返回地址(函数返回后程序继续执行的代码地址)。
3、保存caller的栈底地址。
4、更新当前栈底地址为callee的栈底地址。
5、保存局部变量数据(调试时会把局部变量的空间初值置为0xcccccccc)。
6、保存其他受影响的寄存器(存储数据的媒介)。
7、开始执行函数体。
1、恢复受到影响的寄存器。
2、释放局部变量空间。
3、恢复caller的栈底地址。
4、取出返回地址并按此更新EIP(保存返回地址的寄存器)。
5、回到caller释放参数空间(_cdecl调用约定)。
- 在函数定义中使用函数自身。
- 把规模较大的问题重复转化为规模更小的相似子问题。
- 解决问题的函数必须有明确的结束条件。
- 循环适合解决线性问题,递归不适合解决线性问题。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-7-5 00:26
被流照君编辑
,原因:
赞赏记录
参与人
雪币
留言
时间
一笑人间万事
为你点赞~
2022-7-30 07:24
Youlor
为你点赞~
2022-7-17 11:11
劝鸡从良
为你点赞~
2021-7-4 04:18
赞赏
他的文章
- [分享]C++基础十七-异常机制 8558
- [分享]C++基础十六-模板 8924
- [分享]C++基础十五-运算符重载 8951
- [分享]C++基础十四-抽象类 8662
- [分享]C++基础十三-多态 8455
看原图
赞赏
雪币:
留言: