C语言 递归中的段错误与栈溢出

C语言中,每次递归调用都会多一个栈帧——和普通的函数调用并没有什么不同。由于使用了调用栈,C语言自然支持了递归。在C语言的函数中,调用自己和调用其他函数并没有任何本质区别,都是建立新栈帧,传递参数并修改当前代码行。在函数体执行完毕后删除栈帧,处理返回值并修改当前代码行。

递归调用时新建了一个栈帧,并且跳转到了函数开头处执行,同一时刻可以有多个栈帧,但“当前代码行”只有一个。

“段”(segmentation)是指二进制文件内的区域,所有某种特定类型信息被保存在里面。

调用栈并不储存在可执行文件中,而是在运行时创建。调用栈所在的段称为堆栈段(Stack Segment)。和其他段一样,堆栈段也有自己的大小,不能被越界访问,否则就会出现段错误(Segmentation Fault)。


段错误:一般是数组开小了。

栈溢出:每次递归调用时都需要往调用栈里增加一个栈帧,久而久之就会越界。建议把较大的数组放在main函数外,栈溢出不一定是递归调用太多,也可能是局部变量太大(局部变量也是放在堆栈段的)

你可能感兴趣的:(C语言 递归中的段错误与栈溢出)