C语言-第35课 - 函数调用行为

第35课 - 函数调用行为

  1. 活动记录

活动记录是函数调用时用于记录一系列相关信息的记录,包括:

l 临时变量域:用来存放临时变量的值,如k++的中间结果(生成临时变量,将k的值赋值给临时变量,k=k+1)--temp。

l 局部变量域:用来存放函数本次执行中的局部变量。

l 机械状态域:用来保存调用函数之前有关机器状态的信息,包括各种寄存器的当前值和返回值等。

l 实参数域:用于存放函数的实参信息。

  1. 参数入栈

既然函数参数的计算次序是依赖编译器实现的,那么函数参数的入栈次序是如何确定的呢?由调用约定来描述。我们自己来约定。

  1. 调用约定

(1)当一个函数被调用时,参数会传递给被调用的函数,而返回值会被返回给调用的函数。函数的调用约定就是描述参数是怎么传递到栈空间的,以及栈空间由谁来维护。

(2)参数传递顺序

从右到左一次入栈:_stdcall, _cdecl, _thiscall

从左到右依次入栈:_pascal, _fastcall

l pf为正。

(3)调用堆栈清理

调用者清除栈。

被调用函数返回后清除栈。

注:在调用动态函数库的时候,我们就得规定调用约定,使双方一致,否则在调用的过程中会出错。调用约定的用法,就是在指定的函数前面加上对应的符号就好,如:_pascal f()

小结:

(1) 函数调用是C语言的核心机制。

(2) 活动记录中保存了函数调用以及返回所需要的一切信息。

(3) 调用约定是调用者和被调用者之间的调用协议,常用语不同开发者编写的库函数之间。

原文地址:https://www.cnblogs.com/free-1122/p/9826642.html

时间: 2024-10-10 21:11:10

C语言-第35课 - 函数调用行为的相关文章

[Spark内核] 第35课:打通 Spark 系统运行内幕机制循环流程

本课主题 打通 Spark 系统运行内幕机制循环流程 引言 通过 DAGScheduelr 面向整个 Job,然后划分成不同的 Stage,Stage 是從后往前划分的,执行的时候是從前往后执行的,每个 Stage 内部有一系列任務,前面有分享過,任务是并行计算啦,这是并行计算的逻辑是完全相同的,只不过是处理的数据不同而已,DAGScheduler 会以 TaskSet 的方式把我们一个 DAG 构造的 Stage 中的所有任务提交给底层的调度器 TaskScheduler,TaskSchedu

《快乐编程大本营》java语言训练班 2课:java的变量

<快乐编程大本营>java语言训练班 2课:java的变量 1变量介绍 2变量分类,数值变量 3变量分类-字符串变量 4变量分类-布尔变量 5变量分类-对象 http://code6g.com/pxphp/px/ban2.php?_lmbh1=001&_lmbh2=001001&_lmbh3=001001002提供一对一辅导服务,编程问题找牛哥: 原文地址:http://blog.51cto.com/13149944/2316187

C语言-第33课 - 认清函数的真面目

第33课 - 认清函数的真面目 一.概念 函数的由来 程序 = 数据 + 算法 C程序 = 数据 + 函数 我们下面分析一下汇编语言,汇编语言是从上到下顺序执行的,汇编为了循环执行,就有了跳转指令.通过来回的跳转,就存在了不同的功能模块,这也就是我们C语言中的函数的原型. 函数的意义 模块化程序设计: C语言中的模块化: 面向过程的程序化设计 (1) 面向过程是一种以过程为中心的编程思想. (2) 首先将复杂的问题分解为一个个容易解决的问题. (3) 分解过后的问题可以按照步骤一步步完成. (4

c语言第三课

函数.函数调用.库函数.自定义函数 主函数: 是程序的入口. int main(){ return 0; } 头文件: 头文件往往只包含函数的说明,也就是告诉我们函数怎么用,而函数本身保存在其他文件中,在链接时才会找到. #include<stdio.h> #include命令的作用也仅仅是将头文件中的文本复制到当前文件,然后和当前文件一起编译. c语言的转义字符: put("123abc"); "123abc"对应的ASCII码值的八进制分别是 61.

C 语言学习第二课

初次练习的源代码如下: #include<stdio.h> int main() { int num; num=1; printf("C语言是美丽的"); printf("编程语言 \n"); printf("我是最简单的数字啊\n"); printf("我最喜欢%d.\n",num); return 0; } 其调试及运行的结果如下: 下面我对其中涉及的详细介绍下:(程序细节介绍) #include<std

C语言-第32课 - 野指针和内存操作分析

第32课 - 野指针和内存操作分析 一.概念 初识野指针 l 野指针通常是因为指针变量中保存的值不是一个合法的内存地址而造成的. l 野指针不是NULL指针,是指向不可用内存的指针. l NULL指针不容易用错,因为if语句很好判断一个指针是不是NULL. l C语言中没有任何手段可以判断一个指针是否为野指针. 野指针的由来 (1)局部指针变量没有被初始化. 例: #include <stdio.h> #include <string.h> struct Student { cha

C语言-第31课 - 程序的内存布局

第31课 - 程序的内存布局 代码在可执行程序中有如下的对应关系 有初始值的放在data段,没有初始的放在bss段.静态存储区就对应了这两个区域. 我们写的函数,可移执行的代码段,放在text段. 这里并不见堆和栈的踪影,因为这只是我们的可执行文件的布局,并不会我们执行起来,进程的布局,所以是看不到堆和栈的. 文件布局在内存中的映射 高地址内存 File header 栈 .text 堆 .data .bss .data .bss .text 未映射区域 a.out a.out进程的地址空间 当

C语言-第36课 - 函数递归与函数设计技巧

第36课 - 函数递归与函数设计技巧 一. 递归 递归概述 (1) 递归是数学领域中的概念在程序设计中的应用. (2) 递归是一种强有力的程序设计的方法. (3) 递归的本质为函数内部在适当的时候调用自身. 组成部分 (1)递归点:以不同参数调用自身. (2)出口:不在递归调用 下面就是求一个数的阶乘的函数: #include <stdio.h> int func(int x) { if( x > 1 ) { return x * func(x - 1);  //递归点 } else {

C语言第十一课

主要内容:函数指针 一.函数指针的定义 int  maxValue(int  a,int  b) { return   a > b ? a : b; } 函数名和数组名一样是地址,存在在代码区 int  maxValue(int  a,int  b) int  (*p)(int,int)=  NULL 函数指针定义,p是变量,其他是类型(通常没有形参a,b) p = maxValue(函数指针的使用:赋值函数名) int  m = p(3,5)(指针可当函数用) 练习:定义两个函数,一个求最大值