为什么 C++ 在乘以大于 590x590 的矩阵时会出现分段错误?

Why C++ gives segmentation fault when multiplying matrices more than size of 590x590?

声明 C++ 二维数组的最佳方法是什么,它可以减少固定和有限堆栈大小的影响。由于以下代码中的计算器溢出,我最近遇到了分段错误。 向量如何解决这个问题?

这是我开发的代码。

#include <iostream>
#include <stdlib.h>

using namespace std;

void printMatrix(double *mat);
void generateMat(double *mat);
void multiplyMat(double *a,double *b,double *c);

int n;

int start_s;
    // the code you wish to time goes here
int stop_s;


int main(){ 

    for(int i=500;i<1000;i++){

    cout<< "Enter n:";
    //cin >> n;
    n=i;
    cout<< "n="<<n<<endl;

    double a[n][n],b[n][n],c[n][n]; //c = a * b, c is the
    // result matrix

    generateMat(*a);
    generateMat(*b);

    // initializing c matrix with 0s'
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            c[i][j]=0;
        }
    }

    cout<<"Matrix 1"<<endl;
    //printMatrix(*a);

    cout<<endl<<"Matrix 2"<<endl;
    //printMatrix(*b);

    multiplyMat(*a,*b,*c);

    cout<<endl<<"Result Matrix"<<endl;
    //printMatrix(*c);

    cout << endl<<"Execution time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl;

    }
    return 0;
}

void multiplyMat(double *a,double *b,double* c){
    start_s=clock();
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                *(c+i*n+j)+=(*(a+i*n+k)) * (*(b+k*n+j));
            }
        }
    }
    stop_s=clock();
}

void printMatrix(double *mat){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            cout<< *(mat+i*n+j)<< " ";
        }
        cout<<endl;
    }
}

void generateMat(double *mat){
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            *(mat+i*n+j)=(double)rand()/RAND_MAX*10;
        }
    }
}

您的矩阵在本地 call stack(通常限制为一或几兆字节)上使用 space。

你应该考虑为他们做一个class,它使用堆分配的数据(并在析构函数中释放它)。 is for C, not C++, but should be inspirational (just recode it in genuine C++, perhaps using smart pointers and/or some C++ standard container[s]).

您可以用一些内部 std::vector 数据表示一个矩阵,并提供操作(即成员函数)来调整该矩阵的大小并访问或修改其索引元素 i & j