C++ 使用struct作为函数崩溃程序的返回值
我想使用struct作为function的返回值,但它不起作用,我不知道为什么。运行此程序时程序崩溃。我得了RTE。此代码有什么问题:C++ 使用struct作为函数崩溃程序的返回值,c++,struct,iostream,C++,Struct,Iostream,我想使用struct作为function的返回值,但它不起作用,我不知道为什么。运行此程序时程序崩溃。我得了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){
#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);
}
让我们来计算一下:该结构的大小为201*201*4 sizeofint,几乎为160kB,每个调用在堆栈上创建两个这样的实例,一个用于参数A,一个用于变量B,这意味着每个调用使用大约320kB的堆栈。你有三个电话,所以是960kB。加上主函数中的原始变量T,将堆栈大小提高到1120kB,这超过了Windows上使用的1024kB默认进程堆栈大小。导致堆栈溢出和崩溃 绝对最简单的解决方案?使函数的参数成为常量引用,即
Tablica test(const Tablica& A, int m)
这样做的问题是,在堆栈上的每个调用都至少有一个实例,变量B,所以在堆栈用完之前,它只会给您一些递归调用
一个更复杂的解决方案是使用结构中的数据,这会将数据放在堆上,并使结构小几个数量级。这与上面使用参数引用的解决方案一起,是一个更长期的解决方案,允许您在堆栈耗尽之前进行大量递归调用。不过,它不会永远持续下去,堆栈是一种有限的资源,迟早会耗尽
不推荐的解决方案是增加进程的堆栈大小,这仅适用于上面最后一个解决方案达到极限时,但在增加堆栈大小之前,您应该开始考虑其他更好的设计来解决问题。看起来像堆栈溢出。函数中从未涉及Tablica,因此我怀疑它的相关性…Windows说在我运行此函数后,该程序已停止工作。尝试testT时会发生什么情况,1;?我还不知道问题是什么,但你到底为什么要一次又一次地复制这么大的结构?使用const Tablica&as参数类型@πάνταῥεῖ 不,他不是。所有的树枝都回来了。