函数调用堆栈及活动记录 堆栈溢出 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 引入话题: 局部变量是动态分 ...
 
随机推荐
- 一个vue请求接口渲染页面的例子
			
new Vue({ el:'#bodylist', data: { list: [ { "type_id": "1", "type_name" ...
 - Source Insight 4.0常用设置
			
本文以Source Insight 4.00.0086版本为例讲解常用设置. 1.Source Insight简介 Source Insight是一个面向软件开发的代码编辑器和浏览器,它拥有内置的对C ...
 - 省市区三级联动——思路、demo、示例
			
说明(2017-12-13 11:03:58): 1. 这个功能应该是注册的时候非常.常用的了,不过现在都是微信登录,手机端自动获取位置什么的,可能就网站还用用吧! 2. 这个东西的难点在于统计各地省 ...
 - 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
			
Add an Arbiter to Replica Set 在集群中加入仲裁节点,当集群中主节点挂掉后负责选出新的主节点,仲裁节点也是一个mongo实力,但是它不存储数据. 1.仲裁节点消耗很小的资源 ...
 - 简单网络搭建与测试  mininet
			
简介 本实验是基于pox搭建简单的网络并测试网络的连通性,利用mininet代码创建一个交换机四个主机的拓扑,测试各主机之间的连通性以及h1.h4之间的带宽. 代码 实验代码如下所示,SingleSw ...
 - Spark学习笔记——泰坦尼克生还预测
			
package kaggle import org.apache.spark.SparkContext import org.apache.spark.SparkConf import org.apa ...
 - Java Web项目中连接Access数据库的配置方法
			
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
 - Astah 使用 流程图、类图、时序图
			
1 流程图 右键 _ create Diagrm _ add Flowchart _ New Flowchart 2 时序图 Create Diagram _ ...
 - 使用Three.js里的各种光源
			
1.three.js库提供的光源 three.js库提供了一些列光源,而且没种光源都有特定的行为和用途.这些光源包括: 光源名称/描述 AmbientLight(环境光)/这是一种基础光源,它的颜色会 ...
 - c# 二十四小时制
			
是显示数据时时间格式化12小时制的问题 HH为24小时制 DataFormatString="{0:yyyy-MM-dd HH:mm:ss}" hh为12小时制 DataForma ...