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

时间:2017-06-10 11:26:14

标签: c++ segmentation-fault matrix-multiplication

声明c ++ 2d数组的最佳方法是什么,它对固定和有限的堆栈大小的影响较小。我最近因以下代码中的stackoverflow而出现分段错误。 向量如何解决这个问题?

这是我开发的代码。

#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;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

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

您应该考虑为它们创建一个class,它使用堆分配的数据(并在析构函数中释放它)。

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