栈
的学习笔记-基于
C
语言
栈
的学习笔记-基于
C
语言
本文主要记录作者在学习栈的过程中所作的笔记,仅供参考,如有错误,还请见谅,并请读者补充以及提出建议,谢谢!
在进入正文之前,先温习一下 C
语言的一个重要知识点:
在执行基于 C
语言编写的函数时,并不是直接执行函数内部的代码,而是按下面的步骤进行执行:
- 获取到函数的返回地址
- 划分处一块属于自己的栈,用于保存
LR
等寄存器以及局部变量等 - 对
LR
寄存器进行赋值,该值等于返回地址,即将返回地址保存到栈空间中 - 正式开始执行代码
本文根据下面代码的执行流程,进行阐述 栈
在代码执行的过程中所起到的作用:
#include <stdio.h>
int first_func(int val)
{
int a = 10;
a += val;
second_func();
return a; // ②
}
void second_func()
{
int b = 10;
}
int main()
{
first_func(20);
return 0; // ①
}
开始执行
main()
之前
1、在执行 main()
之前,使用 栈寄存器SP
指向一块空闲的内存
2、然后开始执行 main()
,在执行 main()
之前,会做如下事情:
- 对
LR
寄存器赋值,即等于main()
的返回地址 - 执行
main()
- ①划分出一块属于
main()
的栈,大小假如为M
字节,用来存储LR
等寄存器、局部变量等 - ②将
LR
寄存器的值保存到栈中 - ③执行
main()
中的代码
开始执行
main()
1、开始执行 main()
中的代码,即执行 first_func()
2、在执行 first_func()
之前,会做如下事情:
- 对
LR
寄存器赋值,即等于first_func()
的返回地址等于代码①
的地址 - 执行
first_func()
- ①划分出一块属于
first_func()
的栈,大小假如为F
字节,用来存储LR
等寄存器、局部变量等 - ②将
LR
寄存器的值保存到栈中 - ③执行
first_func()
中的代码
开始执行
first_func()
1、开始执行 first_func()
中的代码
- 将局部变量
a = 10
存储到它的栈空间中 - 将局部变量
a = a + val
存储到它的栈空间中 - 开始执行
second_func()
2、在执行 second_func()
之前,会做如下事情:
- 对
LR
寄存器赋值,即等于second_func()
的返回地址等于代码②
的地址 - 执行
second_func()
- ①划分出一块属于
second_func()
的栈,大小假如为S
字节,用来存储LR
等寄存器、局部变量等 - ②将
LR
寄存器的值保存到栈中 - ③执行
second_func()
中的代码
开始执行
second_func()
开始执行 second_func() 中的代码
- 将局部变量
b = 10
存储到它的栈空间中 second_func()
执行结束- 进入到
second_func()
的栈空间中,将LR
寄存器的值取出 - 根据
LR
寄存器的值进行返回,即返回到代码②return a;
处,进入到first_func()
中 first_func()
执行结束- 进入到
first_func()
的栈空间中,将LR
寄存器的值取出 - 根据
LR
寄存器的值进行返回,即返回到代码①return 0;
处,进入到main()
中 main()
执行结束
至此,整个代码执行过程中,可以看出
栈
所起的作用以及其重要性。
文中如有错误,还请大家指出,共同学习!!!
![](https://i-blog.csdnimg.cn/blog_migrate/03ed4a56c4e4b6bf0e7405fa6ec6e70f.png)