首页 > 其他分享 >【C语言】函数栈帧的创建和销毁

【C语言】函数栈帧的创建和销毁

时间:2024-01-08 10:37:40浏览次数:38  
标签:销毁 函数 esp mov C语言 eax ebp main 栈帧

1、什么是函数栈帧

我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。 那函数是如何调用的?函数的返回值又是如何待会的?函数参数是如何传递的?这些问题都和函数栈帧有关系。

函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,这些空间是用来存放:

  • 函数参数和函数返回值
  • 临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)
  • 保存上下文信息(包括在函数调用前后需要保持不变的寄存器)。

2、理解函数栈帧能解决什么问题呢

理解函数栈帧有什么用呢?

只要理解了函数栈帧的创建和销毁,以下问题就能够很好的理解了

  • 局部变量是如何创建的?
  • 为什么局部变量不初始化内容是随机的?
  • 函数调用时参数是如何传递的?传参的顺序是怎样的?
  • 函数的形参和实参分别是怎样实例化的?
  • 函数的返回值是如何带会的?

让我们一起走进函数栈帧的创建和销毁的过程中。


3、函数栈帧的创建和销毁解析

3.1、什么是栈?

栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。

在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈(First In Last Out, FIFO)。就像叠成一叠的术,先叠上去的书在最下面,因此要最后才能取出(就像放子弹的弹夹

标签:销毁,函数,esp,mov,C语言,eax,ebp,main,栈帧
From: https://blog.51cto.com/u_16189938/9139608

相关文章

  • 通讯录(动态增长版本)——《初学C语言第52天》
    contact.h////此通讯录为静态的版本(设置多少量就是多少,量的大小无法调整)////动态版本:需要多少就给多少,不够用了就开辟新空间,多了就自动减少////文件版本:动、静两种只要退出通讯录,保存的信息就消失了,而文件版本会依旧保存#define_CRT_SECURE_NO_WARNINGS1#define MAX100#define......
  • 动态内存管理:malloc free——《初学C语言第50天》
    //////——————1.动态内存管理(内存空间)////共四个函数:malloc free calloc realloc////1.为什么存在动态内存分配////我们已经掌握的内存开辟方式有:////intval=20;//在栈空间上开辟四个字节////chararr[10]={0};//在栈空间上开辟10个字节的连续空间////......
  • Proxmox VE 超融合集群销毁Ceph Pool
    作者:田逸(formyz)销毁CephPool的目的一套五节点的ProxmoxVE超融合集群,当初为有效利用资源,配备了Nvme高性能磁盘和大容量的SATA机械磁盘(如图所示),高性能Nvme磁盘用于虚拟机的系统盘、数据库的数据存储盘,而大容量的机械盘则用于存储诸如图片、视频、共享数据等对性能要求不高的场景。......
  • 联合union——《初学C语言第49天》
    //////————联合:union////1.联合的定义////联合也是一种特殊的自定义类型//#include<stdio.h>//unionUn//Un为联合标签//{// inta;// charc;//};//structSt//{// inta;// intb;//};//intmain()//{// unionUnu;// printf("%d\n",sizeof(u));//4// printf("%p\n",&am......
  • qt c语言双三次线性插值
    用chatgpt生成的测试了比较卡for(inty=0;y<enlargedHeight;y++){for(intx=0;x<enlargedWidth;x++){//计算原始图像中对应的浮点坐标floatoriginalX=(float)x/(float)enlar......
  • C语言学习随笔-05 变量
    变量:其值在其作用域内可以改变的量交变量,变量在使用前必须定义,每一个变量都有地址。1、变量的命名    ● 变量名由大小写字母、数字和下划线组成,必须以大小写字母或下划线开头,不能以数字开头。    ● C中也允许定义各种其它类型的变量,如枚举、指针、数组、结构体......
  • C语言学习随笔-04 数据类型
    C中的数据类型:在C语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。常用的四中基本数据类型:int、char、float、double    ▶基本类型:它们是算术类型,如int、char、float、double。 ......
  • C语言逆波兰式算法
    1#include<stdio.h>23//数字模式识别4#defineIS_NUM(c)(((c)>='0')&&((c)<='9')||((c)=='.'))5//符号字符识别6#defineIS_OPERATOR(c)(((c)=='+')||((c)=='-')||((c)==&......
  • C语言学习随笔-03 基本语法
    c语言程序由函数构成,每个函数可以实现一个或多个功能。 一个正规程序可以有多个函数,但是有且只有一个主函数。 函数只有在被调用的时候才执行,主函数由系统调用执行。 函数的格式必须按照规范书写。 C语言程序文件的后缀为.c1、C的令牌(Token):C程序由各种令牌组成,令牌可......
  • 枚举——《初学C语言第48天》
    ////三.枚举////枚举:就是一一列举,把可能的取值一一列举。////比如生活中:////1.一周的星期一到星期日是有限的7天,可以一一列举。////2.性别有:男、女、保密,也可以一一列举。////2.月份有12个月,也可以一一列举////这就可以使用枚举了。////————1.枚举类型的定义//enum......