【C语言复习(三十)】函数的调用行为

本文介绍了函数调用过程中的活动记录概念,包括临时变量、局部变量、机器状态及实参数据等内存区域的作用,并详细解释了参数入栈顺序与函数调用约定,最后总结了调用者与被调用者之间的协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、关于活动记录

       活动记录是函数调用时用于记录一系列调用相关信息的记录,大概有如下几个内存域:


       临时变量域:用来存放临时变量的值,如顺序点求值中k++的中间结果
       局部变量域:用来存放函数本次执行中的局部变量;

       机器状态域:用来保存调用函数之前有关于机器的状态信息、包括各种寄存器的当前值和返回地址等;

       实参数据域:用于存放函数的实参信息;

       返回值域:为调用者函数存放返回值; 

2、一些简介

临时变量域:

       之前在C语言复习(二十八)】函数本质、顺序点 中有说到函数调用时的顺序点的问题,int k=1;f(k,k++);这条语句调用后,得到的值是21,那么为什么会这样呢?实际上编译器在处理k++时,有做一个临时变量:
              首先生成一个临时变量,例如:int tmp;

              然后把k的值赋值给tmp

              然后再计算k=k+1

       当计算完成,调用函数传递参数时,第一个要传入k的值,那么就去k的存储空间取值,因为做过k=k+1的运算,所以这时候k的值为2,第二个参数就会去tmp临时变量取值,为1

 

3、参数入栈

       既然函数参数的计算次序依赖于编译器的实现,那么函数参数的入栈次序又是如何的呢??

比如:

       int i=0,j=1;

       fun(i,i+j,j+2,i+1);//值为:0,1,3,1

 

那么活动记录中,参数一块的内存中存放的顺序是:01,3,1呢?还是1310呢?或者还是别的什么顺序??

这就要结合函数的调用约定来说明。

 

4、函数的调用约定

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

参数传递顺序:
       从右到左依次入栈:__stdcall,__cdecl,__thiscall

       从左到右依次入栈:__pascal,__fastcall

 

调用堆栈清理:
       调用者清除活动记录栈空间;

       被调用函数返回后,自己清除活动记录栈空间(C++构造函数与析构函数);

5、小结

       函数调用是C语言的核心机制;

       活动记录中保存了函数调用以及返回所需的一切信息;

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值