小结:

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的更多相关文章

  1. VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)

    在调试一个代码时,执行过程中会出现如下错误(0xC00000FD: Stack overflow). 很明显是堆栈溢出了. 网上很多方法,都是通过修改设置工程配置,把堆栈调大一些,如下图. 但是堆栈到 ...

  2. Error 0xC00000FD: Stack overflow 之 更改堆栈保留大小

    Stack  overflow  顾名思义就是堆栈内存溢出. 一.无限递归 这个要自己仔细检查一下,程序中是否含有无限递归的情况,比如下面这就是无限递归: int function(int x, in ...

  3. VC++中出现stack overflow错误时修改VC++的默认堆栈大小

    VC++中,在栈空间上申请存储的结构体或者类对象的数组空间时,如果数组长度过大,造成申请的栈空间超过或者逼近1MB时,程序可以编译通过,但是不能够执行起来.打到调试模式时会弹出如下图所示的栈空间越界错 ...

  4. 【转】Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题

    原文见:http://www.cnblogs.com/xiangwengao/archive/2012/03/16/2399888.html 问题 给一个程序添加小功能,在debug下能正常运行,在r ...

  5. C语言过程活动记录

    C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等.解决这个问题的经典机制是堆栈中的活动记录. 当每个函数被调用时,都会产生一个过程记 ...

  6. 浅谈C/C++堆栈指引——C/C++堆栈

    C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这种问题:什么时候数据存储在飞鸽传书堆栈(Stack)中.什么时候数据存储在堆(Heap)中.我们知道.局部变量是存储在堆栈中的.debu ...

  7. 浅谈C/C++堆栈指引——C/C++堆栈很强大(绝美)

    C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:deb ...

  8. (八)函数调用为何会发生“Stack Overflow”

    一.一次函数调用分析 c代码: // function_example.c #include <stdio.h> int static add(int a, int b) { return ...

  9. c语言活动记录-图解(一)

    来源: 1.<代码揭秘>第六章函数与函数调用 2.http://blog.csdn.net/zhuliting/article/details/6839233 引入话题: 局部变量是动态分 ...

随机推荐

  1. Vue 温故而知新 props如何双向属性绑定

    传送门:https://cn.vuejs.org/v2/guide/components-custom-events.html https://segmentfault.com/q/101000001 ...

  2. SNF开发平台WinForm-审核流使用方法样例

    一.效果如下: 二.如何实现 1.程序的数据表设计规范,参考<09.SNF-C#编程规范V1.5.docx>文件. 2.程序操作程序 2.1.在程序页面拖拽控件 2.2.程序的Load事件 ...

  3. 赋值文件夹名称为日期的doc命令

    copy D:\111.txt d:\%date:~0,4%年%date:~5,2%月%date:~8,2%日.*

  4. pattern-matching as an expression without a prior match -scala

    https://www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html https://docs.scala-lang. ...

  5. Unity的Attribute(特性)还算多吧

    属性 (Attribute) 使用 Unity 的C#语言 ,利用属性(Attribute)来类定义和变量定义或区分其他的变量,您可以设置一种特殊行为.* 1 例如,您添加[SerializeFiel ...

  6. Asp.Net EF查看生成sql(MiniProfiler)

    查看ef生成的sql有很多种方法,这里介绍两种几种的方法 方法1:浏览器直接方法/Home/getsql直接查看sql //方法1:浏览器直接方法/Home/getsql直接查看sql public ...

  7. Oracle分割字符串 REGEXP_SUBSTR用法

    分割字符串中所有指定字符,然后成多行参数说明,参数1: 待分割字符串参数2:正则表达式参数3:起始位置,从第几个字符开始正则表达式匹配(默认为1)参数4:标识第几个匹配组,默认为1参数5:模式('i' ...

  8. mac中安装wxpython

    一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...

  9. Java编程的逻辑 (79) - 方便的CompletionService

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  10. c# 调用非托管c++dll 参数问题(转)

    在C#中调用C(C++)类的DLL的时候,有时候C的接口函数包含很多参数,而且有的时候这些参数有可能是个结构体,而且有可能是结构体指针,那么在C#到底该如何安全的调用这样的DLL接口函数呢?本文将详细 ...