C语言 递归中的段错误与栈溢出
C语言中,每次递归调用都会多一个栈帧
——和普通的函数调用并没有什么不同。由于使用了调用栈,C语言自然支持了递归。在C语言的函数中,调用自己和调用其他函数并没有任何本质区别,都是建立新栈帧
,传递参数并修改当前代码行。在函数体执行完毕后删除栈帧,处理返回值并修改当前代码行。
递归调用时新建了一个栈帧,并且跳转到了函数开头处执行,同一时刻可以有多个栈帧,但“当前代码行”只有一个。
“段”(segmentation)
是指二进制文件内的区域,所有某种特定类型信息被保存在里面。
调用栈并不储存在可执行文件中,而是在运行时创建。调用栈所在的段称为堆栈段(Stack Segment)
。和其他段一样,堆栈段也有自己的大小,不能被越界访问,否则就会出现段错误(Segmentation Fault)。
栈溢出:每次递归调用时都需要往调用栈里增加一个栈帧,久而久之就会越界。
建议把较大的数组放在main函数外,栈溢出不一定是递归调用太多,也可能是局部变量太大(局部变量也是放在堆栈段的)。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: js 判断数组是否为空
- 下一篇: JSP九大内置对象的作用和用法总结