首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 目录 前言 什么是 什么是函数的帧 认识相关寄存器和汇编指令...下面我们要先来理解一些概念 什么是 在学习C语言中,我们关注内存中的3个区域,区、堆区和静态区 那究竟什么是呢?...⏩ (stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了,没有就没有函 数,没有局部变量,也就没有我们如今看到的所有的计算机语言。...函数帧的销毁下 00BE177F pop edi //在顶弹出一个值,存放到edi中,esp+4 00BE1780 pop esi //在顶弹出一个值,存放到esi中,esp+4 00BE1781...局部变量不初始化时,编译器在创建函数帧后会在帧空间里面放入一个值,而这个值是随机的 如果给局部变量初始化时,会将随机值覆盖 函数调用时参数时如何传递的?传参的顺序是怎样的?

50510
您找到你想要的搜索结果了吗?
是的
没有找到

C语言共享

的操作我相信大家都应该了解了弄懂了, 如果没弄懂希望可以去再去看看相关的资料,我博客中的C语言中缀表达式转后缀表达式中涉及到了一下的基本操作,有兴趣的朋友也可以看看。...所谓共享,就是两个共同使用一块内存空间,其中一个底作为另一个顶,反之亦然。...开始 思路分析 因为两个公用一个空间,假设一个为0#,规定其为时top[0]==-1;另一个为1#规定其为时,top[1]==MaxSize; 入时,先确定号是否合法,然后查看是对0#还是...如果出成功返回0;出失败返回-1; 添加适当的头文件,定义一个数据结构, 共享也是,只不过有点特殊,在这里我们还是需要添加适当的头文件和定义恰当的数据结构 #includetop[1] = MaxSize; } 入操作 在入的时候,我们需要选择入的是两个中的哪一个,我们这里用0和1来区分 int Push(SqStack*s, ElemType x, int

1.2K30

C语言:底层剖析——函数帧的创建和销毁

一、究竟什么是函数帧      C语言的使用是面向过程的, 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。...所以C语言的程序都是以函数作为基本单位的,如果能够深入理解函数,无疑对于c语言会有更深刻地理解,修炼自己的内功,那么函数是如何调用的?函数返回值是如何返回的?...三、函数帧的创建和销毁 3.1 什么是?...(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了,没有就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。        ...3.5.5.6Add函数的帧销毁 此图为Add函数的帧销毁 pop         edi     在顶弹出一个值,存放到edi中,esp+4 pop         esi     在顶弹出一个

18810

C语言内功的修炼--函数创建和销毁

目录 什么是帧 什么是 帧的创建与销毁 main函数调用过程  Add函数的调用过程 ---- 什么是帧 简单地说 程序的执行过程可看作连续的函数调用,而C语言中,每个帧对应着一个未运行完的函数...每个函数的每次调用(通常使用堆栈实现),都有它自己独立的一个帧 这个帧中保存了该函数的返回地址和局部变量维持着所需要的各种信息 所以帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构...从逻辑来看 帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等 ---- 什么是 在详解之前我们还得明白一点,也叫堆栈,是一种数据结构,具有先进后出的特点...共同维护函数帧 ---- 帧的创建与销毁 在VS2013下逐步调试add函数向大家展示并讲解帧的创建和销毁过程 int Add(int x, int y) { int z = 0;...eax,add(加法)将[ebp + 0Ch]地址的内容加给eax,然后mov(赋值)将eax内容赋值给[ebp - 4]地址的内容 函数内部并没有直接创建一个参数x,y,而是调用了传参过来的寄存器中的值

51120

C语言——F函数的帧的创建和销毁

(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了,没有就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。         ...,是因为main函数调用时,在区开辟的空间的其中每一个字节都被初始化为0xCC,而arr数组是一个未初始化的数组,恰好在这块空间上创建的,0xCCCC(两个连续排列的0xCC)的汉字编码就是“烫”,所以...= 0; 00BE1849 mov dword ptr [ebp-20h],0 //将0存储到ebp-20h的地址处,ebp-20h的位置其实是c变量 //以上汇编代码表示的变量a,b,c创建和初始化...,这就是局部的变量的创建和初始化 //其实是局部变量的创建时在局部变量所在函数的帧空间中创建的 //调用Add函数 c = Add(a, b); //调用Add函数时的传参 //其实传参就是把参数push...1、局部变量是如何创建的? 答:一个新的函数帧创建,并将局部变量推入到函数帧空间,然后为其分配内存空间。 2、为什么局部变量不初始化内容是随机的?

7110

c语言实现(顺序,链)

个人主页: :✨✨✨初阶牛✨✨✨ 推荐专栏: C语言进阶 个人信条: 知行合一 本篇简介:>:讲解用c语言实现:“数据结构之"”,分别从"顺序"和"链"的接口讲解....""不需要进行随机访问其中的元素,只能从顶访问,链表是可以完成的. 2.1 初始化"链" 对于链表实现的,如果不带头结点: 我们不需要特意去写一个初始化函数.只需要创建一个顶指针,将其初始化指向...(下面的代码是采用这种形式) //创建一个顶指针,并完成初始化 SLStackNode* SLStack = NULL; 如果是带头结点的单链表: 我们可以定义一个初始化函数,申请一个头结点(头结点的数据域不存数据...* SLStack = InitStack(); 2.2 入(压,向""中插入数据) 步骤:(与单链表的头插类似) 创建一个新节点....;//防止的删除操作 SLStackNode* head = *pps;//记录顶元素的地址 *pps = (*pps)->next;//更新顶,即原来顶的下一个结点 free(head

20520

C语言加油站】函数帧的创建与销毁

本篇文章的内容会帮助大家进一步学习和理解C语言的相关知识点。...二、函数帧的创建 函数帧的创建与维护是通过 bp 和 sp 这两个寄存器实现的,在汇编语言中,这两个寄存器被称为 ebp 和 esp 。...z这一行; 此时我们就完成了Add函数的函数帧的创建,接下来我们就要进行局部变量z的创建与函数形参的使用了; 七、形参与实参 这里我们来分析一下代码: int z = 0; 00C417A5 mov...大家现在有没有发现汇编语言的逻辑的严谨之处。...结语 今天的内容到这里就全部结束了,本篇内容是函数篇章的一个补充知识点,这一部分内容对各位在C语言学习的理解上也会有很大的帮助。

43230

C语言括号匹配(括号匹配c语言)

如果遇到左括号,就入,如果遇到一个右括号,就与顶元素比较,如果匹配,出,就继续重复操作,直到字符串没有了。期间一旦出现不匹配的括号对就直接输出no ,如果空了,说明匹配了,就输出yes。...(char c)//判断是否为右括号,是返回1,否返回0. { if(c==')'||c=='}'||c==']') { return 1;...int top=0;//初始化顶top=0; char s[200];//存放字符串。...printf("no"); return 0; } } } //如果不是在for循环中结束,那么就需要判断是否为...因为不是在for循环中结束,说明都匹配成功了,但会出现特殊情况比如((()),令不为。所以是否括号匹配成功不仅要判断是否右括号都有左括号使其匹配,还需要判断是否为

2.5K20

C语言的实现

你可以把视作一个有下底的盒子,然后你把各种书放进去,如果你想拿书,你拿到的第一步一定是你最后放进去的,这就是 首先考虑他的形势,我们需要一个top指针和一个buttom指针分别指向顶和底的下一个节点...因为方便:试想一下我们要判断是否空就只需要判断top是否等于buttom,如果buttom指向底显然就会麻烦许多 下面我们先用C语言来实现一下: 首先我们需要对这个装东西的“盒子”定义,而这个盒子就是...、判断是否为/满的操作,注意,由于我们这里讲的是链式,所以不存在满,如果用数组储存就会遇到 结构创建完成我们需要创建一个,前面我们已经说了要想让只需要top=buttom,于是你可能很容易写出现下面代码...*n=sk->top; sk->top=n->next; delete n; } 就像上面,另还要注意出需要考虑是否为,我没有写 至此,一个C语言版本的及其主要操作就完成了,这也是我第一次写结构...,因为我用C++ stack sk; sk.push(5); //..

3.8K40

洛谷 || C语言

题目背景 是计算机中经典的数据结构,简单的说,就是限制在一端进行插入删除操作的线性表。 有两种最重要的操作,即 pop(从顶弹出一个元素)和 push(将一个元素进)。...的重要性不言自明,任何一门数据结构的课程都会介绍。宁宁同学在复习的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。...题目描述 宁宁考虑的是这样一个问题:一个操作数序列1,2,…,n(图示为 1 到 3 的情况), A 的深度大于n。...现在可以进行两种操作, 将一个数,从操作数序列的头端移到的头端(对应数据结构的 push 操作) 将一个数,从的头端移到输出序列的尾端(对应数据结构的 pop 操作) 使用这两种操作,由一个操作数序列就可以得到一系列的输出序列...输入格式 输入文件只含一个整数 n(1≤n≤18)。 输出格式 输出文件只有一行,即可能输出序列的总数目。

1.2K30

C语言创建链表

一、链表中结点的存储        链表的结点左边一部分是存放的数据,右边一部分是后继指针指向下一个结点的地址。...C语言中通常定义一个结构体类型来存储一个结点,如下: struct node { int data; struce node *next; //下一个结点的类型也是struct node...当链表还没有建立时,头指针head为。 struct node *head; head=NULL; //头指针初始为   现在我们来创建一个结点,并用临时指针p指向这个结点。...d",&a); //读取数据 p->data=a; //将数据存储到当前结点的data域中 p->next=NULL; //设置当前结点的后继指针指向,也就是当前结点的下一个结点为   把新加入的结点串进链表...如果该结点是创建的第一个结点,则将头指针指向这个结点再将当前指针指向这个结点;如果该结点不是第一个,则将上一个结点的后继指针指向该结点再修改当前指针指向这个新结点。

1.7K20

用numpy如何创建一个数组?

导读 最近在用numpy过程中,总会不自觉的需要创建数组,虽然这并不是一个明智的做法,但终究是可能存在这种需求的。本文简单记录3种用numpy生成数组的方式。 ?...我们的目标是创建一个指定列数、但空无一行的数组。...也就说,它只是用于创造一个给定形状、但未初始化实体的数组。例如: ? 那么,如果我们需要创建一个没有任何值的数组呢?这里以生成0行3列的数组为例,笔者想到了3种方案。。...---- 02 利用列表创建 初始化numpy数组的一种方式是由列表创建,那么当我们传入的列表是列表时即可创建数组。...为了创建一个数组,我们可以首先考虑先创建一个的DataFrame,然后由其转换为numpy对象即实现了创建数组。 首先,我们创建一个仅有列名、而没有索引和值的DataFrame: ?

8.6K10

C语言实现顺序

文章目录 顺序的常规操作 定义顺序结构体 初始化顺序 顺序判满 顺序 计算顺序的长度 顺序(Push) 顺序(Pop) 顺序各操作测试 源代码 ?...typedef struct SeqStack{ ElemType datas [MAXSIZE]; int top; // 顶指针 }*Stack; 注意:这里 顶指针top,指向的是元素的上一个位置...如果指向元素当前位置,初始化顺序的时候可以把 top = -1; 顶指针top,指向的是元素的上一个位置(初始 top = 0)。...== MAXSIZE; } 顺序 /* * 顺序 * s 顺序 */ int StackEmpty(Stack s){ if(s == NULL){ return FALSE...源代码 源代码已上传到 GitHub Data-Structure-of-C,欢迎大家下载 C语言实现数据结构

5.3K20

必备 :C语言基础

在《全的技术设想》中埋下了4种编程语言的伏笔,已经兑现了Javacript,Python和Java, 本想将C/C++一并整理,但涉及面向对象等设计技术,最终还是C 梳理一下,从0到1吧。 ?...一个变量在内存中的地址就称为该变量的指针,这是C语言中的精华,下面单独描述。 C语言还提供了十分丰富的运算符,主要有如下34种: 算术:+、-、*、/、++等 关系:>、<、==、!...程序是支持函数执行的内存区域,通常和堆共享,包括返回地址,局部数据存储,参数存储,指针和基指针(运行时管理的指针)。系统在创建帧时,将参数以跟声明相反的顺序推到帧上,最后推入局部变量。...编译 C语言的编译过程有预编译——>语法分析——>代码生成——>优化——>汇编——>连接。预编译器完成宏替换,词法分析,并创建符号表。语法分析包含了语义分析,创建语法树。...不同标准库的实现并不相同,提供的函数也不完全相同,不过有一个它们都支持的最小子集,这也就是最典型的C语言标准库。

1.1K30
领券