【问题标题】:How to run Ackermann's Fuction without error in C/C++? [closed]如何在 C/C++ 中无错误地运行阿克曼函数? [关闭]
【发布时间】:2020-02-27 05:19:35
【问题描述】:

那么如何运行 Ackermann 的函数而不遇到 Segmentation fault (core dumped) 错误,因为我的程序试图访问/扩展它无法访问的内存?也许将 GCC 的内存限制扩大到 256MB?它会在大约 9MB 的内存使用情况下导致此错误。我运行 Manjaro Linux

代码:

#include<stdio.h>

int ack (int m, int n) {

    if (m == 0)
        return n + 1;
    else if (n == 0)
        return ack(m - 1, 1);
    else
        return ack(m - 1, ack(m, n - 1));
}

int main() {

    int i, j;

    for (i = 0; i <= 5; i++)
        for (j = 0; j <=5; j++)
            printf("Result for ackermann(%d, %d) is: %d\n",i, j, ack(i, j));

    return 0;
}

为重现结果添加了代码

【问题讨论】:

  • 我猜你需要修复你的代码。
  • 我们可以看看实现吗?函数很紧凑,代码应该不会太大吧?
  • 无代码 == 我们无法回答。 minimal reproducible example 请。
  • 发生了一些事情,所以无法回到这里。例如,我添加了代码。抱歉耽搁了

标签: c++ c segmentation-fault ackermann


【解决方案1】:

这几乎肯定不是“内存使用过多”的问题。请注意,GCC 没有内存限制。如果你有一个真正的限制,那是你的操作系统的一个功能。在 Mac OS 或 UNIX 变体之一下,请参阅 ulimit 命令。我不知道你在 Windows 下做什么。

如果您遇到分段错误,那是因为您试图访问尚未分配的内存。这很可能是由于以下三种情况之一:

  • 取消引用空指针
  • 取消引用完全未初始化的指针
  • 取消引用存储在内存中已被重用的指针( 可以指向谁知道在哪里)

您的核心文件应该告诉您是哪一行代码导致了段错误。这应该可以帮助您追踪它发生的原因。

【讨论】:

  • Ackerman 的函数是递归的,所以他可能是堆栈空间不足——而不是内存不足。这个谈论改变堆栈空间(包括你的 ulimit 答案):stackoverflow.com/questions/2275550/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2010-11-28
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多