C语言函数调用时栈中内存的变化 10

好比有如下函数voidg(inti){i=5;}voidf(intj){g(j);}voidmain(void){inta=5;f(a);return;}这个函数在栈中执... 好比有如下函数
void g(int i)
{
i = 5;
}

void f(int j)
{
g(j);
}

void main(void)
{
int a = 5;
f(a);
return ;
}

这个函数在栈中执行的顺序,它们的内存是如何变化的。
展开
 我来答
空雪梦见
2014-02-27 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1197万
展开全部

这是执行到g里面的i=5这条语句之时的堆栈

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tattackor
推荐于2016-10-02 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:888万
展开全部
程序中,一个函数是一个过程,这个过程可以分为包括传入参数、过程代码、返回三部分构成。由于一个函数过程需要用到内部变量、临时变量等,所以需要在进程空间的栈空间分配一段存储片段来存储函数过程中的这些参数,该内存片段即为栈帧。
栈帧的由来:
为一个函数的过程提供一个存储函数局部变量,参数,返回地址和其他临时变量;
栈帧的周期:
进入函数~函数返回,该阶段内栈帧作为
不同的语言具体的实现方式略有不同,但是,总体上,fun(a,b);
局部变量:
包括函数传入的形参和函数内部定义的变量;
返回地址:
指令指针P指向call fun,那么fun栈帧存储的返回地址为P+1;现今的编译器的一个约定是将返回地址存到一个固定的寄存器中,这样比读取栈帧(内存)效率要高。
临时变量:
主要为计算,运算过程中的中间临时变量;
参数传递:
其一:如果fun中调用另一个函数k(a,b...n);那么,传递的参数是形参,按照现代编译规定,前k个形参是通过寄存器传递,后n-k个形参通过栈帧的实参部分(栈帧的尾部)来传递;
其二:主要为在fun中要调用函数g(&a,&b),那么为g()函数传出实参(形参是通过寄存器来传递的)是通过“传出实参”区块进行的,这么做主要是为了保证该实参能够被内层嵌套的函数访问。比如,g函数由调用一个k(a地址)函数,同样需要用到a的地址,所以fun在传递参数时必须为实参(&a)传递申请固定的内存存储空间(而非用寄存器)这样k函数可以通过固定的内存地址(fun的形参列表来获取参数值)。这时的g的栈帧为fun栈帧的下一帧(相邻的空间地址),即调用者和被调用者的栈帧是相连的;
保护的寄存器:
栈帧作为函数过程的一个临时内存存储区块,同时负责函数调用过程中寄存器值的保存和还原。即:假设fun函数目前占用了寄存器Ri存储一个临时变量t,而此时调用了函数g(),在g()函数中可能需要用到寄存器Ri做运算的临时存储,那么如何确保g()函数调用返回后,Ri恢复到fun中t的原来值。这就需要在调用者或者被调用者中选择其一来保存原有Ri的值,即caller-save或者callee-save。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cdyzxy
2014-02-27 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3729万
展开全部
举例说明:
执行到f(a)时,系统将当前程序指针入栈,然后是a的值,
栈内容:【f(a)点程序指针】【5】栈顶
执行到void f(int j)时,系统将此函数用到的寄存器以及相关寄存器压栈保护
栈内容:【f(a)点程序指针】【5】【f保护现场】栈顶
执行到g(j)时,系统将当前程序指针入栈,然后是j的值,
栈内容:【f(a)点程序指针】【5】【f保护现场】【g(j)点程序指针】【5】栈顶
执行到void g(int j)时,系统将此函数用到的寄存器以及相关寄存器压栈保护
栈内容:【f(a)点程序指针】【5】【f保护现场】【g(j)点程序指针】【5】【g保护现场】栈顶
执行到i=5时,会根据栈指针位置找到压栈的参数5,然后赋值,修改的是栈中的数据(离栈顶近的5)
结束g函数,将【g保护现场】数据弹栈,恢复现场
栈内容:【f(a)点程序指针】【5】【f保护现场】【g(j)点程序指针】【5】栈顶
直接找到【g(j)点程序指针】位置弹栈程序指针,程序指针加1,执行下条语句(g(j);的下条)
栈内容:【f(a)点程序指针】【5】【f保护现场】栈顶
结束f函数,将【f保护现场】数据弹栈,恢复现场
栈内容:【f(a)点程序指针】【5】栈顶
直接找到【f(a)点程序指针】位置弹栈程序指针,程序指针加1,执行下条语句(return)
栈内容:恢复到调用f(a)时的内容
上边所谓直接找到程序指针位置,就是记录参数所占字节数给栈指针加这个值导致舍弃栈中的参数
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式