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

Using struct as a return value of function crash program

我想使用 struct 作为函数的 return 值,但它不起作用,我也不知道为什么。当我 运行 这个程序时程序崩溃。我得到了 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);

}

让我们算一算:该结构的大小几乎为 160kB (201 * 201 * 4 (sizeof(int))),每次调用都会在堆栈上创建两个这样的实例,一个用于参数 A,一个用于变量 B,这意味着每个调用使用大约 320kB 的堆栈。您有 3 个调用,所以是 960kB。 加上原来的变量Tmain函数中将使用的堆栈大小增加到1120kB,超过了1024kB Windows 上使用的默认进程堆栈大小。导致堆栈溢出和崩溃。

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

Tablica test(const Tablica& A, int m)

这个问题是你仍然至少有一个实例在堆栈上的每个调用,变量 B,所以在 运行 结束之前给你更多的递归调用堆栈。

一个更复杂的解决方案是对结构中的数据使用 std::vector,这会将数据放在堆上并使结构变小几个数量级。这与上面使用参数引用的解决方案一起是一个更长期的解决方案,并且将允许您在 运行 出栈之前进行大量递归调用。不过它不会永远持续下去,堆栈是一种有限的资源,迟早你还是会 运行 出局。

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