栈在函数调用中的应用

猪头小哥 2012-02-23 06:37:31
RT,能不能详细的解释解释,最好有相应的例子,能让一般人看的明白的语言表达,嘿嘿~~
...全文
223 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-03-31
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
猪头小哥 2012-03-30
  • 打赏
  • 举报
回复
嗯嗯 现在明白多了~~~
[Quote=引用 22 楼 的回复:]

楼主应该关心数据结构中的栈,那样更通用
cpu栈只是个具体的例子
[/Quote]
Lactoferrin 2012-03-30
  • 打赏
  • 举报
回复
楼主应该关心数据结构中的栈,那样更通用
cpu栈只是个具体的例子
majia2011 2012-02-24
  • 打赏
  • 举报
回复
哈哈哈,关注一下

期待更高的回复
猪头小哥 2012-02-24
  • 打赏
  • 举报
回复
B的状态有哪些,比如~~
[Quote=引用 19 楼 hu7324829 的回复:]

引用 14 楼 zhutou100hao 的回复:

B的当前状态怎么保存下来呢?
引用 11 楼 kuzuozhou 的回复:

要在函数B里面调用函数A应该怎么做?是不是应该先将B的当前状态保存下来,然后再将A的数据装进来,等A处理完了以后,再将A的数据清除,最后将B的状态恢复...其实这个过程就是一个栈的结构,先将压栈的顺序是 B的状态->A的数据,出栈顺序相反 A的数据->B的……
[/Quote]
hu7324829 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zhutou100hao 的回复:]

B的当前状态怎么保存下来呢?
引用 11 楼 kuzuozhou 的回复:

要在函数B里面调用函数A应该怎么做?是不是应该先将B的当前状态保存下来,然后再将A的数据装进来,等A处理完了以后,再将A的数据清除,最后将B的状态恢复...其实这个过程就是一个栈的结构,先将压栈的顺序是 B的状态->A的数据,出栈顺序相反 A的数据->B的状态。这不就和上面的处理过程一致吗?当然,你使用其他的方法……
[/Quote]

B的状态先压栈!
x363635334 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 w170532934 的回复:]
栈的作用可大了,在贴上解释估计很难讲清楚,推荐看下《深入理解计算机系统》
[/Quote]
这位妞 栈已经不是作用大不大的说了,栈是函数调用本质依赖啊
caohaiwd 2012-02-23
  • 打赏
  • 举报
回复
简单一句话,没有栈就没有嵌套和递归
pengfoo 2012-02-23
  • 打赏
  • 举报
回复
给楼主个链接:分析的不错:
http://wenku.baidu.com/view/2b8fc4a10029bd64783e2c65.html
pengfoo 2012-02-23
  • 打赏
  • 举报
回复
涉及保护现场的概念 :调用的地方的变量,函数返回地址,等等入栈,从而当函数调用结束返回时,这些保护的现场再回复
猪头小哥 2012-02-23
  • 打赏
  • 举报
回复
B的当前状态怎么保存下来呢?
[Quote=引用 11 楼 kuzuozhou 的回复:]

要在函数B里面调用函数A应该怎么做?是不是应该先将B的当前状态保存下来,然后再将A的数据装进来,等A处理完了以后,再将A的数据清除,最后将B的状态恢复...其实这个过程就是一个栈的结构,先将压栈的顺序是 B的状态->A的数据,出栈顺序相反 A的数据->B的状态。这不就和上面的处理过程一致吗?当然,你使用其他的方法也是可以的,但是栈的操作要简单许多,压栈和出栈只需要移动头指针就可以了。
[/Quote]
pengfoo 2012-02-23
  • 打赏
  • 举报
回复
以上均参考论坛前辈宝贵经验
pengfoo 2012-02-23
  • 打赏
  • 举报
回复
学过汇编语言吗?如果学过的话就很好解释啦,不过也没事,其实你问的问题是涉及到C的底层工作机制的,C的底层就是汇编,我们举一个例子,pirntf("%d %d",a,b);这个函数的实现机制是什么呢?首先这个函数有三个参数,在执行此函数时,会将此函数的三个参数压入栈中(sp指针会一直指向栈顶元素的),那么函数就会对这些数据进行处理(因为就在栈中,很容易找到数据的位置,这些不是你做的,是编译器替你完成的),如果函数调用完成,则sp就会恢复到函数调用前的位置,也就是我们说的数据被释放啦,其他函数也是如此。比如:
int add(int x,int y)
{
int z;
z = x + y;
return z;
}

只是在栈中又开辟了z的空间,函数调用后会自动释放的。这就是我们经常说的局部变量,如果想深入理解他的汇编级是怎么实现的,请用command下debug -u 进行反汇编,找到汇编代码仔细研究。堆就是函数动态分配的空间,比如malloc();分配的空间都是在堆里面,我所讲的都是在DOS下,windows下会稍微复杂一些,基本原理都一样。

pengfoo 2012-02-23
  • 打赏
  • 举报
回复
要在函数B里面调用函数A应该怎么做?是不是应该先将B的当前状态保存下来,然后再将A的数据装进来,等A处理完了以后,再将A的数据清除,最后将B的状态恢复...其实这个过程就是一个栈的结构,先将压栈的顺序是 B的状态->A的数据,出栈顺序相反 A的数据->B的状态。这不就和上面的处理过程一致吗?当然,你使用其他的方法也是可以的,但是栈的操作要简单许多,压栈和出栈只需要移动头指针就可以了。

猪头小哥 2012-02-23
  • 打赏
  • 举报
回复
先谢谢了~~
[Quote=引用 9 楼 project2502 的回复:]

详细见 <<软件调试>> 这本书的 第22章 栈和函数调用
[/Quote]
project2502 2012-02-23
  • 打赏
  • 举报
回复
详细见 <<软件调试>> 这本书的 第22章 栈和函数调用
猪头小哥 2012-02-23
  • 打赏
  • 举报
回复
你能举2个函数之间的调用来详细的说说吗?
[Quote=引用 4 楼 redshiliu 的回复:]

先压入下一条指令地址,然后从右至左压入参数,call
不同的调用约定稍有不同
[/Quote]
猪头小哥 2012-02-23
  • 打赏
  • 举报
回复
给个具体的章节吧,不想拿到一本书就从头看到尾
[Quote=引用 2 楼 w170532934 的回复:]

栈的作用可大了,在贴上解释估计很难讲清楚,推荐看下《深入理解计算机系统》
[/Quote]
downmooner 2012-02-23
  • 打赏
  • 举报
回复

我汇编只有那水平...
merlinfang 2012-02-23
  • 打赏
  • 举报
回复
看sprintf的代码
加载更多回复(4)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧