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

pet*_*ter -4 c++ struct iostream

我想使用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);

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Som*_*ude 6

让我们算一下:结构大小差不多是160kB(201*201*4(sizeof(int))),每次调用在堆栈上创建两个实例,一个用于参数A,一个用于变量B,意味着每个调用使用大约320kB的堆.你有三个电话,所以这是960kB.加上函数中的原始变量T,main使用的堆栈大小为1120kB,这超过了Windows上使用的1024kB默认进程堆栈大小.导致堆栈溢出和崩溃.

绝对最简单的解决方案?使函数的参数成为常量引用,即

Tablica test(const Tablica& A, int m)
Run Code Online (Sandbox Code Playgroud)

这样做的问题是你在堆栈上的每个调用仍然至少有一次实例,即变量B,这样只需在堆栈用完之前再给你一些递归调用.

更复杂的解决方案是std::vector用于结构中的数据,该数据将数据放在堆上并使结构的数量小一些.这与上面使用参数的解决方案一起使用是一个更长期的解决方案,并且在用完堆栈之前会允许你进行大量的递归调用.它不会永远持续下去,堆栈是一个有限的资源,迟早你仍然会耗尽.

不推荐的解决方案是增加进程的堆栈大小,这仅适用于上述最后一个解决方案达到限制的情况,但是在增加堆栈大小之前,您应该开始考虑其他更好的设计来解决您的问题.