我正在尝试运行此代码,由于某种原因,在执行过程中崩溃时出现"分段错误(核心转储)"当我在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;
}
答案 0 :(得分:2)
(假设一个典型的基于堆栈的系统)进程的部分内存被指定为执行堆栈。每个函数调用都将在堆栈上创建一个框架。该帧将包含局部变量,也可能包含一些实现细节,例如调用者帧的地址。
由于每个函数调用都在堆栈上创建一个新帧,因此每个嵌套函数调用都会增加堆栈的高度。堆栈空间不是无限的。存在特定于平台的限制。如果您尝试在堆栈上放置太多帧,堆栈将溢出。这就是你的程序发生的事情。
解决方案:不要编写产生大量递归调用的函数。当没有必要时,避免递归调用。例如,您的递归可以由迭代循环结构替换:
void test(int* ptr) {
while(counter++ != 10000000)
cout << ptr[0];
}