✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 目录 前言 什么是栈 什么是函数的栈帧 认识相关寄存器和汇编指令...寄存器 相关的汇编指令: 函数的调用堆栈 函数栈帧的创建 分析栈帧的创建: 为什么会出现“烫烫烫”: 分析main函数中的核心代码: 分析Add函数的传参 函数调用过程 函数栈帧的销毁下 结语✍ --...如何理解"烫烫烫"的由来 只要理解了函数栈帧的创建和销毁,以上问题就能够很好的理解了,这也是本篇博客的主要目的。...下面我们要先来理解一些概念 什么是栈 在学习C语言中,我们关注内存中的3个区域,栈区、堆区和静态区 那究竟什么是栈呢?...⏩ 栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函 数,没有局部变量,也就没有我们如今看到的所有的计算机语言。
一、究竟什么是函数栈帧 C语言的使用是面向过程的, 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。...所以C语言的程序都是以函数作为基本单位的,如果能够深入理解函数,无疑对于c语言会有更深刻地理解,修炼自己的内功,那么函数是如何调用的?函数返回值是如何返回的?...三、函数栈帧的创建和销毁 3.1 什么是栈?...栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。 ...对形参进行及时的销毁。 五、对 二 中的问题进行解释 通过对函数栈帧的创建和销毁学习后,对于这个函数的底层知识有了更深刻的理解。以此们可以解决目录二中提到的问题。
三、函数栈帧的创建和销毁解析 1、什么是栈?...栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。 ...3、函数栈帧的创建和销毁过程,在不同的编译器上实现的方法大同小异。...= 0; 00BE1849 mov dword ptr [ebp-20h],0 //将0存储到ebp-20h的地址处,ebp-20h的位置其实是c变量 //以上汇编代码表示的变量a,b,c的创建和初始化...3.5、函数栈帧的销毁 当函数调用要结束返回的时候,前面创建的函数栈帧也开始销毁。 那具体是怎么销毁的呢?我们看一下反汇编代码。
目录 什么是栈帧 什么是栈 栈帧的创建与销毁 main函数调用过程 Add函数的调用过程 ---- 什么是栈帧 简单地说 程序的执行过程可看作连续的函数调用,而C语言中,每个栈帧对应着一个未运行完的函数...内存从高地址往低地址使用 寄存器edp存放了指向函数栈帧栈底的地址(高地址) 寄存器esp存放了指向函数栈帧栈顶的地址(低地址) esp和ebp共同维护函数栈帧 ---- 栈帧的创建与销毁...在VS2013下逐步调试add函数向大家展示并讲解栈帧的创建和销毁过程 int Add(int x, int y) { int z = 0; z = x + y; return z;..., esi,ebx寄存器退出栈顶 并用mov(赋值)命令将ebp寄存器中的地址赋值给esp(ebp,esp是维护空间边界的两个寄存器,当他俩地址相遇时,代表这片空间消失)相当于将为Add函数开辟的空间销毁...ebp就回到了main函数的栈底 ---- ret(返回)返回存放在当前栈顶的地址中的地址值,即回到了刚才Call(声明返回地址)指令的下一条指令处(即把形参也弹出去了) ---- add函数栈帧的创建和销毁就已经完成了
呵呵昨天花了一个圆,今天想画个太极图,我知道没啥技术含量,但是挺有意思的,希望各位看官不要鄙视我不务正业,画完此图,不再做这些事情。
📷 注:转自:hirak0
本篇文章的内容会帮助大家进一步学习和理解C语言的相关知识点。...接下来就是要回到main函数了; 八、函数栈帧的销毁 在回到main函数之前,程序执行了如下操作: 00C417B5 pop edi 00C417B6 pop esi...大家现在有没有发现汇编语言的逻辑的严谨之处。...那到目前为止,函数栈帧的创建与销毁过程我就全部介绍完了,后面还有涉及到printf函数的调用与main函数的函数栈帧的销毁我就不过多叙述了。如果各位还有何疑问的话可以在评论区留言哦!...结语 今天的内容到这里就全部结束了,本篇内容是函数篇章的一个补充知识点,这一部分内容对各位在C语言学习的理解上也会有很大的帮助。
生活中对象都是被初始化后才上市的 生活中的对象被销毁前会做一些工作 问题1 : C++中如何清理需要销毁的对象?...一般而言,需要销毁的对象都应该做清理 解决方案 为每个类都提供一个public的free函数 对象不再需要时立即调用free函数进行清理 class Test { int* p; public..., 很可能造成资源泄露 问题2: C++编译器是否能够自动调用某个特殊的函数进行对象的清理?...析构函数 C++的类中可以定义一个特殊的清理函数 这个特殊的清理函数叫做析构函数 析构函数的功能与构造函数相反 定义 : ~ClassName() 析构函数没有参数也没有返回值类型声明 析构函数在对象销毁时自动调用...小结 析构函数是对象销毁时进行清理的特殊函数 析构函数在对象销毁时自动被调用 析构函数是对象释放系统资源的保障
我们就使用一个简单的c语言程序来对描述一下在函数调用的时候都发生了什么。 ?...中间的一小段没有意义的汇编语言是为了方便设置断点,为后面的调试做好铺垫,因为有时会碰到找不到断点位置的情况,使用这个方法,可以在找不到断点的时候向后执行一次,而不破坏我们想调试的程序当前的堆栈状态,这里对...我们先假设初始状态下的堆栈图如下,esp与ebp的真实距离我们省略。 ? 接下来我们来看一下后面的操作。 ?...然后让esp减去了0c0h位,开始提升堆栈了,为程序的运行开辟一个存储空间,这个区域也就是平时所说的缓冲区,因为一个单元是四个字节,c0也就是往上提了48个格,由于位置有限中间依旧省略,此时堆栈就变成了如下的样子...接下来让esp增加0c0,也就恢复到了提升堆栈之前的位置,此时esp与ebp到了一个位置。 ?
这里主要介绍: 图的各种定义 图的顶点与边之间的关系 图的存储结构(邻接矩阵、邻接列表等) 图的遍历方法(深度优先、广度优先) 最小生成树算法(Prim 算法、Kruskal 算法) # 图的各种定义...n\cdot logn稀疏图和稠密图:边或弧数以 为分界。 网:即带权的图。...(同上) 连通图的生成树:即一个极小的连通子图,含有图中全部的 n 个顶点,但只有 n-1 条边(对一个图删去多余的边)。 有向树:恰有一个顶点的入度为 0,其余顶点的入度均为 1 的有向图。...# 图的存储结构 ---- 下面使用 C语言 来描述数据结构 先把最小单位定义一下: typedef char[4] Vertex;// 顶点信息 typedef int Weight;// 权重...重复 2、3,直到遍历完所有的边,此时已形成最小生成树 Example: 参考: C 语言数据结构与算法视频教程全集 VisuAlgo - 图形据结构(邻接矩阵,邻接列表,边缘列表)
来源:百度文库 C语言程序设计知识结构 第一课 C语言程序设计基础 第二课 选择结构与循环结构 第三课 数组 第四课 指针 第五课 函数 第六课 结构体、链表与共用体 第七课 编译预处理
C++中,如果对象是用new操作生成的,那么它的空间被分配在堆(Heap)上,只有显示地调用delete(或delete[])才能调用对象的析构函数并释放对象的空间。...那么,在程序的其他存储区(Data段,Stack)上的对象依据什么样的顺序产生和销毁的呢? 考察如下程序。...(3)所有在栈(stack)上的对象都比在全局或静态对象早销毁。 (4)不管是在栈上的对象,还是全局或静态对象,都遵循这样的顺序:越是先产生的对象越是后被销毁。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.15(P180-P181)]
ES.61: Delete arrays using delete[] and non-arrays using delete ES.61:使用delete[]销毁数组,使用delete销毁对象 Reason...这是C++语言的要求,如果用错会导致资源释放错误或者内存破坏。
,相信家人们读完这篇文章之后能让你眼里的代码变得透明起来(本章不需要过多了解汇编语言,重点是了解函数栈帧怎么创建和销毁的) 注意:这里我们用的是32位平台,用VS2013作为参考。...C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。(来自百度百科)。...= 0; c = Add(a, b); printf("%d\n", c); return 0; } 这是一个很简单加法逻辑。...把eax的值赋给[ebp-20h](这个地址就是局部变量C的地址)eax是个寄存器,之前我们把变量Z的值放了进来,也就是说我们最后把变量Z放进了变量C里面。...剩下的main函数的销毁和之前add的销毁一样。 结束 到这里函数栈帧与销毁就讲完了,我相信大家对于上面的疑惑都有了答案。
C++中,如果对象是用new操作生成的,那么它的空间被分配在堆(Heap)上,只有显示地调用delete(或delete[])才能调用对象的析构函数并释放对象的空间。...那么,在程序的其他存储区(全局/静态存储区,stack区)上的对象是依据什么样的顺序产生和销毁的呢? 考察如下程序。...(3)所有在栈(stack)上的对象都比在全局/静态区的对象早销毁。 (4)不管是在栈上的对象,还是全局/静态区的对象,都遵循这样的顺序:越是先产生的对象越是后被销毁。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.15(P180-P181)]
、前言 turtle是 python 内置的一个比较有趣味的模块,俗称 海龟作图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言
C语言的寄存器包括:eax , ebx , ecx , edx , ebp , esp 函数栈帧 ebp ,esp 这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的....Add(int x, int y) { int z = 0; z = x + y; return z; } int main() { int a = 10; int b = 20; int c...= 0; c = Add(a, b); printf("%d\n", c); return 0; } 学习基础 在学习这个执行过程之前,我们需要找到反汇编 ,我们需要通过打断点运行并调试代码后在调试处...esp的值给ebp 给esp的地址减0E4h 将ebx压入栈顶,esp上移 将esi压入栈顶,esp上移 将edi压入栈顶,esp上移 动态理解 简化版过程动图:
C语言的开发场景: 应用软件 主要包含各种软件如:QQ,百度网盘,游戏 (上层) 操作系统 windows/macOS/Linux (下 电脑硬件 ...层) C语言是一个擅长底层开发的语言。...而C语言的主要编译器有:Clang/GCC/MSVS。
一、C 语言发展 C 语言 被开发之前 并 没有经过 缜密 的 设计 , 而是在 使用过程中 逐渐完善的 ; C 语言发展经过如下阶段 : 初始阶段 : 1972年至1978年 , C语言 初步形成 ,...C99 , C11 , C17 等标准 , 以满足新的编程需求 ; 二、C 语言缺陷 C 语言有如下缺陷 : C 语言 没有经历过 缜密的 设计过程 , 都是根据需求逐渐完善的 , 出现了很多缺陷和漏洞...2、C 语言与 C++ 语言关系 C 语言 与 C++ 语言 并 不是 竞争关系 ; C++ 语言 是 以 C 语言为基础 的 加强版本编程语言 , 可以看作是更好的 C 语言 , 在 C++ 语言...中 , 可以使用 C 语言语法 , 对 C 语言完全兼容 ; C++ 语言 包含 C 语言 , 在 C++ 代码中可以使用 C 语言的语法 , 但是在 C 语言中不能使用 C++ 的语法 ; 3、C++...语言应用场景 C 语言 和 C++ 语言的应用场景 : C语言 应用场景 : 系统软件、操作系统、编译器等 底层系统级应用 ; C++ 语言 应用场景 : 大型应用程序、游戏 等更 高级的应用 ; 在不同的
/put t4 t1 t2 t3 t5 4、小结: 局部对象的构造顺序依赖程序的执行流 堆对象的构造顺序依赖于new的使用顺序 全局对象的构造顺序是不确定的 二、析构函数: 1、c++的类中可以定义一个特殊的清理函数...,叫做析构函数,这个函数的功能与构造函数相反,顾名思义就是销毁的意思了。...2、定义:~ClassName() 析构函数没有参数也没有返回值类型声明 析构函数在对象销毁时自动被调用 代码示例: #include class Test { int mi...4、小结: 析构函数是对象销毁时进行处理的特殊函数 析构函数在对象销毁时自动被调用 析构函数是对象释放系统资源的保障
领取专属 10元无门槛券
手把手带您无忧上云