独闷闷网

 找回密码
 立即注册
搜索
查看: 6754|回复: 0
收起左侧

[原创] 入栈出栈原理是什么?C语言编程哪些操作最容易爆栈?爆栈后果是什么?已解答。

[复制链接]
发表于 2015-8-9 23:07:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2015-8-9 23:55 编辑

清枫-湖南:
请问一下在keil里函数递归调用出现警告该怎么解决?百度上有的说keil里不允许函数递归调用是这样吗?

冷夜-上海:
keil允许递归调用的,弱弱的问一下,可不可以把警告截图上来?

清枫-湖南:
截图的警告如下:
递归.jpg
★小谢-福州:
递归还是尽量少用。除非深度你完全知道。否则很容易就爆栈。


Goem-顺德:
就像合泰低端芯片只有6层栈.我朋友写合泰汇编试过,会不定时复位.

冷夜-上海:
对的,一但SP指针回卷就会复位.很诡异的现象.反正注意一点,连你自己都不知道需要占用多少栈内存的程序就不要运行了。迟早出问题。编译器报错是最简单的错误,不报的错误才是最郁闷的。


★坚鸿-深圳:
个人建议,单片机程序里不要出现递归。人家FatFS系统为了兼容各类单片机程序都坚决不用递归了,何况我们自己做项目。我觉得递归对单片机来说是一片禁区,不要去尝试。

★小谢-福州:
我以前就遇到过了。早上九点到晚上12点就为这一个错误。


冷夜-上海:
我也是。当时是运行我自己的系统,跑着跑着就有一条线程跑飞了。就是查不出来什么原因。结果是爆栈了...
★坚鸿-深圳:
什么情况下最容易爆栈?

★小谢-福州:
递归就最容易。

冷夜-上海:
申请大数组这是最容易爆的,其次就是递归,但是递归是最诡异的,因为编译器不报错,申请局部大数组编译器可能会警告和报错。而递归是不会有任何报错的。局部数组是分配在栈。

Goem-顺德:
不断调函数,内部又调用,如此循环。


★小谢-福州:
堆还是安全的。

冷夜-上海:
单片机没有堆这么一个概念。只有操作系统存在才会有堆的概念。单片机只有静态区和栈,全局变量统一归为静态区使用,所有局部变量都在栈。还有中断.....


Goem-顺德:
入中断就一层栈。调用函数一层栈。以最坏情况计算吧。

冷夜-上海:
单片机的中断也会导致爆栈。可能还不止,如果中断内申请了局部变量或者数组要全部算上。有玩过ucos的嘛?玩过系统的就知道了。一个函数入栈的大小是随着函数的变量大小而变化的。如果一个函数啥变量和入参都没有一般就是讲SP指针和通用寄存器入栈。如果有入参,那么入参要入栈。如果有变量,变量也要算上。所有的编程语言都遵循这一规则。


Goem-顺德:
你的意思是临时变量归栈管理。嵌套就会不断加层。


★坚鸿-深圳:
什么嵌套?if语句嵌套也会吗?

Goem-顺德:
函数嵌套函数。


★小谢-福州:
返回地址也要算上。

冷夜-上海:
所有的编程语言都遵循这一规则。返回地址就是SP。if语句也会,但是if语句只是将SP入栈,这个不算太耗费栈,仔细回忆一下汇编的if语句怎么写,伴随着if语句总会有一个跳转指令,这个跳转指令就是入栈,如果条件不成立,那么不会入栈,如果成立,将会入栈。

Goem-顺德:
判断+jump?jump不是地址的偏移量吗?

冷夜-上海:
但是你要返回呀,返回就要记录返回地址。当你if嵌套足够多的时候也会爆栈。

Goem-顺德:
哦哦,所以我们写汇编不返回,用jump跳回去。


★坚鸿-深圳:
涨见识了。我以前一直不太深入研究过这个问题。那么,为什么要用到入栈和出栈呢?谁能简单介绍一下大概原理。

冷夜-上海:
哦,其实也挺好理解的。一但有分支语句存在就必然存在返回的问题,那么要返回的话必然要恢复先前在的位置继续跑,那么就要靠栈来保存PC指针的值。记住指令位置,然后CALL或者JUMP到指定位置运行,运行完毕后栈保存的PC指针弹出,继续先前分支语句的下一条执行。

Goem-顺德:
系统分配的栈不够用,栈指针越界,这就叫爆栈。

啦啦-青岛:
话说内存不是栈区和静态存储区公用的嘛?

冷夜-上海:
看平台了。诺依曼结构使得,哈佛结构不是。

啦啦-青岛:
如果没有局部变量,那么静态区可以占用全部内存,对吗?

冷夜-上海:
不是,就算没有局部变量,静态区也不能占用全部内存,要留出内存块给函数调用和嵌套使用。

★坚鸿-深圳:
其实栈就是专门给函数,嵌套,跳转指令临时用来保存SP指针的内存,这样理解对不对?

冷夜-上海:
差不多就这意思。就是弄一块地方来确保函数的正常运行。

啦啦-青岛:
保存原先的运行环境。




乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-3-29 15:00 , Processed in 0.195126 second(s), 32 queries .

快速回复 返回顶部 返回列表