【问题标题】:segmentation fault when function called repeatedly [duplicate]重复调用函数时出现分段错误[重复]
【发布时间】:2017-01-20 15:45:05
【问题描述】:

我正在尝试运行这段代码,由于某种原因,该代码在执行过程中因“分段错误(核心转储)”错误而崩溃。当我在 Code::Blocks 调试模式下运行此代码时,调用堆栈向我显示了一个不同的指针地址经过大约 130000 次迭代。

#include <iostream>
using namespace std;
long long counter = 0;
void test(int* ptr)
{
    cout << ptr[0];
    if (counter == 10000000)
        return;
    counter++;
    test(ptr);
}
int main()
{
    int arr[2];
    arr[0] = 10;
    arr[1] = 20;
    test(&(arr[0]));
    return 0;
}

【问题讨论】:

  • 递归函数调用没有停止条件
  • 所以内存会耗尽
  • @jophab 有,但是需要 10 000 000 次调用才能到达它,所以你首先得到一个 stackoverflow。
  • @Borgleader 是的.. 没错:)
  • 提示:您在正确的网站上发帖 :)

标签: c++ c++11


【解决方案1】:

(假设一个典型的基于堆栈的系统)进程的部分内存被指定为执行堆栈。每个函数调用都会在堆栈上创建一个框架。该框架将包含局部变量,还可能包含一些实现细节,例如调用者框架的地址。

由于每个函数调用都会在堆栈上创建一个新框架,因此每个嵌套函数调用都会增加堆栈的高度。堆栈空间不是无限的。有特定平台的限制。如果您尝试将太多帧放入堆栈,堆栈将溢出。这就是您的程序所发生的情况。

解决方案:不要编写进行大量递归调用的函数。避免不必要的递归调用。例如,您的递归可以替换为迭代循环结构:

void test(int* ptr) {
    while(counter++ != 10000000)
        cout << ptr[0];
}

【讨论】:

  • 好的,我明白了..谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多