C++ 使用struct作为函数崩溃程序的返回值

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){

我想使用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){
            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参数类型@πάνταῥεῖ 不,他不是。所有的树枝都回来了。