函数调用堆栈及活动记录 堆栈溢出 stack overflow
小结:
1、当被调函数返回主调函数时,被调函数的 活动记录-activation record / 堆栈帧-stack frame 被 弹出-popping 程序执行栈-program execution stack / 函数调用栈-function call stack。
函数调用堆栈及活动记录
想了解函数调用的实现细节,首先需要认识一种被称为堆栈(stack)的数据结构(即一个关联数据项的集合)。我们可以将堆栈想像成一摞盘子。当我们想放一只盘子时,通常是将这只盘子放在这一摞盘子的顶部,相当于将盘子压入(pushing)堆栈。同样,当我们想取出一只盘子时,总是从一摞盘子的顶部取出盘子,相当于将盘子弹出(popping)堆栈。可见,堆栈是一种后进先出(Last-In,First-Out,LIFO)的数据结构,最后被压入(插入)的数据总是最先被弹出(移除)。
当程序调用一个函数时,被调用函数必须知道如何返回主调函数。所以,主调函数的返回地址必须压入程序执行堆栈(program execution stack)----有时也被称为函数调用栈(function call stack)。如果发生一系列的函数调用,其对应的一组返回地址将按照后进先出的顺序被压入堆栈,这样每个函数才能够正确地返回它的主调函数。
由于函数每次被调用时通常都会产生一些局部变量,所以程序执行堆栈专门为这些局部变量保留出一定的存储空间。保存在程序执行堆栈中的这些数据,被称为函数调用的活动记录(activation record)或堆栈帧(stack frame)。当发生一次函数调用时,它对应的活动记录被压入程序执行堆栈。当函数返回到主调函数后,它对应的活动记录将被弹出堆栈,并且保存在其中的局部变量将不再被程序所访问。
当然,由于计算机的内存容量是有限的,所以程序执行堆栈中用来保存活动记录的存储单元的总数有一个上限。如果连续发生多次的函数调用产生的活动记录超过了这一上限,将会发生堆栈溢出(stack overflow)。
FROM
《C How to Program,Sixth Edition》
函数调用堆栈及活动记录 堆栈溢出 stack overflow的更多相关文章
- VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)
在调试一个代码时,执行过程中会出现如下错误(0xC00000FD: Stack overflow). 很明显是堆栈溢出了. 网上很多方法,都是通过修改设置工程配置,把堆栈调大一些,如下图. 但是堆栈到 ...
- Error 0xC00000FD: Stack overflow 之 更改堆栈保留大小
Stack overflow 顾名思义就是堆栈内存溢出. 一.无限递归 这个要自己仔细检查一下,程序中是否含有无限递归的情况,比如下面这就是无限递归: int function(int x, in ...
- VC++中出现stack overflow错误时修改VC++的默认堆栈大小
VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来.打到调试模式时会弹出如下图所示的栈空间越界错 ...
- 【转】Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题
原文见:http://www.cnblogs.com/xiangwengao/archive/2012/03/16/2399888.html 问题 给一个程序添加小功能,在debug下能正常运行,在r ...
- C语言过程活动记录
C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等.解决这个问题的经典机制是堆栈中的活动记录. 当每个函数被调用时,都会产生一个过程记 ...
- 浅谈C/C++堆栈指引——C/C++堆栈
C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这种问题:什么时候数据存储在飞鸽传书堆栈(Stack)中.什么时候数据存储在堆(Heap)中.我们知道.局部变量是存储在堆栈中的.debu ...
- 浅谈C/C++堆栈指引——C/C++堆栈很强大(绝美)
C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:deb ...
- (八)函数调用为何会发生“Stack Overflow”
一.一次函数调用分析 c代码: // function_example.c #include <stdio.h> int static add(int a, int b) { return ...
- c语言活动记录-图解(一)
来源: 1.<代码揭秘>第六章函数与函数调用 2.http://blog.csdn.net/zhuliting/article/details/6839233 引入话题: 局部变量是动态分 ...
随机推荐
- struts2:struts.properties配置文件介绍及常量加载顺序
1. 背景 struts2框架中有两个核心配置文件,其中struts.xml文件主要负责管理应用中的action映射,以及该action包含的result定义等.除此之外,struts2框架还包括一个 ...
- Fiddler插件开发 - 实现网站离线浏览功能
有这么一种应用场景: 你是做前端或APP开发的,需要调用服务端提供的接口,接口只能在公司内网访问:在公司外就无法调试代码了. 想在公司外访问怎么办呢? 如果在公司的时候将所有接口的响应内容都保存起来, ...
- JAVA(一)JAVA基础/面向对象基础/高级面向对象
成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...
- 【emWin】例程二十二:窗口对象——Framewin
简介: 框架窗口为您的应用提供一个PC 应用程序的窗口外观.这些窗口由周围框架.标题栏和用户区组成. 触摸校准(上电可选择是否进入校准界面) 截图 实验指导书及代码包下载: 链接:http://pan ...
- ZigBee基础
Zigbee技术 Zigbee由Zigbee联盟制定的无线网络协议,在IEEE 802.15.4标准的基础上设计,是一种自愈.安全和稳健的网状网协议,可扩展到更大范围内的数百个节点.主要用于距离短.功 ...
- Java编程的逻辑 (84) - 反射
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- (转载)Redis5.0重量级特性Stream尝鲜
转 导读:Redis5.0最新重点推出了Stream的支持,给众多架构师在消息队列方面带来了新的选择,特别是Redis粉丝们绝对是一个福音.那么Redis的Stream有哪些特别的功能?跟kafka有 ...
- [原创] Xinput_1.3.DLL / MSVCR100.DLL文件缺失解决办法
缺少如上文件,最简单粗暴的办法就是360卫士,找人工服务搜索方案,一键修复,屡试不爽!
- tmux常用配置
首先创建配置文件 $ touch ~/.tmux.conf 一,鼠标支持 对于version 2.1 (18 October 2015)之后的版本,编辑配置文件.tmux.conf, 保存即可. se ...
- 关于启动过程及log
1.tomcat的启动过程及log 2.webapp的启动过程及log 3.spring的启动过程及log 4.springmvc的启动过程及log 5.web.xml的启动过程及log