作者:gxh123 | 来源:互联网 | 2023-05-24 16:25
我想使用struct作为fucntion的返回值,但它不起作用,我不知道为什么.运行此程序时程序崩溃.我得到了RTE.这段代码有什么问题:
#include
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 " <
1> Some program..:
让我们算一下:结构大小差不多是160kB(201*201*4(sizeof(int)
)),每次调用在堆栈上创建两个实例,一个用于参数A
,一个用于变量B
,意味着每个调用使用大约320kB的堆.你有三个电话,所以这是960kB.加上函数中的原始变量T
,main
使用的堆栈大小为1120kB,这超过了Windows上使用的1024kB默认进程堆栈大小.导致堆栈溢出和崩溃.
绝对最简单的解决方案?使函数的参数成为常量引用,即
Tablica test(const Tablica& A, int m)
这样做的问题是你在堆栈上的每个调用仍然至少有一次实例,即变量B
,这样只需在堆栈用完之前再给你一些递归调用.
更复杂的解决方案是std::vector
用于结构中的数据,该数据将数据放在堆上并使结构的数量小一些.这与上面使用参数的解决方案一起使用是一个更长期的解决方案,并且在用完堆栈之前会允许你进行大量的递归调用.它不会永远持续下去,堆栈是一个有限的资源,迟早你仍然会耗尽.
不推荐的解决方案是增加进程的堆栈大小,这仅适用于上述最后一个解决方案达到限制的情况,但是在增加堆栈大小之前,您应该开始考虑其他更好的设计来解决您的问题.