栈的学习笔记-基于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() 执行结束

在这里插入图片描述

至此,整个代码执行过程中,可以看出 所起的作用以及其重要性。

文中如有错误,还请大家指出,共同学习!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值