有没有办法增加堆栈大小/递归限制?

6

我正在编写一个C程序,在递归时超过了递归限制,导致段错误。有没有办法增加程序的递归限制(比如通过增加堆栈大小),无论是通过GCC选项还是命令行选项?该程序在Ubuntu上运行。


你的意思是堆栈溢出了,因此发生了分段错误? - Iharob Al Asimi
@iharob:没错,我用gdb验证过了。 - Claudiu
为什么不用迭代的方式来编写它呢? - mrk
如果您可以通过优化GCC将尾递归调用格式转换为循环,则可以进行替换。 - BLUEPIXY
由加载器创建的线程的堆栈大小是链接器参数,所以是的。 - Martin James
你不应该编写非常深的递归函数。这是不可靠的,也是糟糕编码的症状。将程序转换为迭代形式(例如使用CPS转换)。或者使堆栈帧更小(通过在堆中分配大部分数据,即使是临时数据,并适当地进行free释放)。请编辑您的问题以更多地了解您的C程序,并提供您的递归函数源代码。 - Basile Starynkevitch
2个回答

6

您可以在Linux上使用ulimit更改堆栈大小,例如:

ulimit -s unlimited

在使用Visual Studio的Windows系统中,使用/F选项

1
@iharob:这个问题被标记为gcc,如果是Windows的话,可能会被标记为mingw。 - Dietrich Epp
3
ulimit -s unlimited并不能真正使堆栈大小无限制。它只是允许使用系统配置的最大限制。 - wallyk
@PeterHorvath,你所说的2M限制是什么?假设这个限制在Linux上是2M(通常更高),为什么你不能在你的系统上改变这个限制呢? - ouah
@PeterHorvath,我不知道你在说什么,静态对象不会被放进栈中。 - ouah
@ouah 对的。我的意思是使用本地的3兆数组(不是使用malloc分配,而是使用类似于local char x[3<<10]之类的方法)。 - peterh
显示剩余2条评论

2
堆栈大小是操作系统的一个函数,尽管许多早期的操作系统(例如MSDOS)没有进行程序堆栈段控制:保留足够大小的段是由程序来完成的。
随着虚拟内存和32位API的出现,堆栈大小通常由资源管理机制提供。例如,在Linux上,ulimit命令提供了一种堆栈大小控制的源。内核内提供了其他级别的控制,强制执行系统策略、内存限制和其他限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接