当我选择大于720的矩阵大小时,程序会以错误代码退出。原因是什么? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我选择大于720的矩阵大小时,程序会以错误代码退出。原因是什么? [重复]相关的知识,希望对你有一定的参考价值。

我试图在C ++中运行以下代码,在每次迭代中打印数字,但它返回退出值:-1.073.xx

n小于720时它起作用。

int main() {
    int n = 820;
    double xy[n][n];
    double k = 0;

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; j++) {
            xy[i][j] = k;
            k++;
            cout << xy[i][j] << endl;
        }
    }
    return 0;
}
答案

double xy[n][n]这样的局部变量存储在堆栈中。在您的情况下,分配超过5 MB,这超过了某些操作系统上的默认堆栈大小。如评论中所述,这将导致堆栈溢出。

有两种解决方案:

  1. 使用链接器设置增加要为程序分配的堆栈大小。建议不要这样做,因为堆栈是在程序的整个运行时分配的。
  2. 在堆上分配数组变量,最好使用STL容器,例如std::vector<std::vector<double>> xy;
另一答案

尝试在堆而不是堆栈上创建内存。此代码可能有所帮助。

double **dd = new double*[n];
for(int i = 0;i<n;i++){
    dd[i] = new double[n];
 }

以上是关于当我选择大于720的矩阵大小时,程序会以错误代码退出。原因是什么? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

具有外生变量矩阵的 statsmodels SARIMAX 大小不同

由于堆大小增加,android中的内存不足错误

Visual c++ 6.0 应用程序大小大于 Visual Studio 2010 应用程序大小

即使堆空间大于文档大小,Java 堆空间错误也会抛出“在转换 550 mb 文档时”

上传错误代码签名 Mapbox.framework 失败

当我尝试增加矩阵大小时,在 AMD openCL/C 中实现矩阵向量乘法会导致系统死机