【问题标题】:Is there any way to increase the stack size/recursion limit?有没有办法增加堆栈大小/递归限制?
【发布时间】:2015-03-23 01:33:44
【问题描述】:

我正在编写一个 C 程序并且由于分段错误而超出了递归限制。有没有办法通过 GCC 的选项或命令行选项来增加程序的递归限制(可能通过增加堆栈大小)?该程序正在 Ubuntu 上运行。

【问题讨论】:

  • 你的意思是你的堆栈溢出,因此发生了分段错误?
  • @iharob:是的,我通过gdb 验证了这一点。
  • 为什么不迭代写呢?
  • 如果可以转换尾递归调用格式可以通过优化GCC替换为循环。
  • 加载器创建的线程的堆栈大小是链接器参数,所以是的。

标签: c linux gcc recursion stack-overflow


【解决方案1】:

堆栈大小是操作系统的一个函数,尽管许多早期的操作系统(例如 MSDOS)没有进行程序堆栈段控制:由程序保留足够大小的段。

对于虚拟内存和 32 位 API,堆栈大小通常由资源管理机制提供。例如,在 Linux 上,ulimit 命令提供了一种堆栈大小控制来源。其他级别的控制由内核内部强制执行系统策略、内存限制和其他限制的机制提供。

【讨论】:

    【解决方案2】:

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

    ulimit -s unlimited
    

    在装有 Visual Studio 的 Windows 上,使用 /F option

    【讨论】:

    • @iharob:这个问题被标记为 gcc,如果是 Windows,它可能会被标记为 mingw。
    • ulimit -s unlimited 并没有真正使堆栈大小不受限制。它只允许使用最大系统配置限制。
    • 我认为 OP 希望扩大 2M 堆栈限制......你不会用 ulimit 改变它,afaik 那是另一回事。 (羽绒服)
    • @PeterHorvath 你说的这个 2M 限制是什么?假设 Linux 上的这个限制是 2M(通常更高),为什么不允许您更改系统上的这个限制?
    • 最终效果更好的是给它一个数字,例如ulimit -s 1000000
    猜你喜欢
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2019-06-23
    • 2014-09-11
    • 2012-09-02
    • 2011-11-24
    • 2011-01-30
    相关资源
    最近更新 更多