我想使用struct作为fucntion的返回值,但它不起作用,我不知道为什么。运行此程序时程序崩溃。我得到了RTE。这段代码出了什么问题:
#include <iostream>
using namespace std;
struct Tablica{
int T[201][201];
};
Tablica test(Tablica A, int m){
if(m==1)return A;
if(m%2 ==1){
return test(A, m-1);
}else{
cout <<" #1 m " << m<<endl;
Tablica B = test(A,m/2);
cout <<" #2 m " << m<<endl;
return B;
}
}
int main(){
Tablica T;
test(T,10);
}
答案 0 :(得分:6)
让我们算一下:结构的大小几乎是160kB(201 * 201 * 4(sizeof(int)
)),每次调用在堆栈上创建其中两个实例,一个用于参数A
,一个用于变量B
,意味着每个调用使用大约320kB的堆栈。你有三个电话,所以这是960kB。 {strong> Plus T
函数中的原始变量main
,将用于1120kB的堆栈大小增加到超过1024kB的默认进程堆栈大小视窗。导致堆栈溢出和崩溃。
绝对最简单的解决方案?使函数的参数成为常量引用,即
Tablica test(const Tablica& A, int m)
这个问题是你在堆栈上每次调用时仍然至少有一次实例,即变量B
,这样只需要在堆栈用完之前再给你一些递归调用。
更复杂的解决方案是对结构中的数据使用std::vector
,这会将数据放在堆上并使结构的数量小一些。这与上面使用参数的解决方案一起使用是一个更长期的解决方案,并且在用完堆栈之前会允许你进行大量的递归调用。它不会永远持续下去,但是堆栈是一种有限的资源,迟早你仍然会耗尽。
不推荐的解决方案是增加流程的堆栈大小,这仅适用于上述最后一个解决方案达到限制的情况,但是在增加堆栈大小之前,您应该开始考虑其他更好的设计来解决问题