重复调用函数时的分段错误

时间:2017-01-20 15:45:06

标签: c++ c++11

我正在尝试运行此代码,由于某种原因,在执行过程中崩溃时出现"分段错误(核心转储)"当我在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;
}

1 个答案:

答案 0 :(得分:2)

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

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

解决方案:不要编写产生大量递归调用的函数。当没有必要时,避免递归调用。例如,您的递归可以由迭代循环结构替换:

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