似乎是乘法和为multVact分配新值的问题

时间:2019-04-18 07:19:20

标签: c++ segmentation-fault vertices

创建两个向量,并将值分配给两个向量,然后将两个向量彼此相乘。 (矩阵乘法)。在乘法函数中给出分段错误。尝试访问范围之外的位置是否有帮助?

#include<iostream>
#include <vector>

using namespace std;

int n;
vector <int> mat1Rows;
vector <int> mat2Rows;
vector <int> multRows;
vector <vector<int> > mat1;
vector <vector<int> > mat2;
vector <vector<int> > multMat;

void assignValues(int num){

        for(int i = 0; i < num; i++){
                for(int j = 0; j < num; j++){
                        mat1Rows.push_back(j);
                        mat2Rows.push_back(j);
                }
                mat1.push_back(mat1Rows);
                mat2.push_back(mat2Rows);

        mat1Rows.clear();
        mat2Rows.clear();
        }
}

void multiply(int n){

        for(int i = 0; i < n; ++i){
                for(int j = 0; j < n; ++j){
                        for(int k = 0; k < n; ++k){

                multMat[i][j] += mat1[i][k] * mat2[k][j];
                        }
                }
    }
}

void displayMult(int n){

    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){

            cout << multMat[i][j] << " " ;
        }

        cout << endl;
    }

}

int main(){

    cout << "Enter the size of the matrix: ";
    cin >> n;

    assignValues(n);

    multiply(n);

    displayMult(n);

    return 0;   
}

1 个答案:

答案 0 :(得分:1)

 multMat[i][j] += mat1[i][k] * mat2[k][j];

multMat内没有内存,因为您没有为元素保留任何内存。您需要告诉向量分配内存。您可以使用resize完成操作,为元素分配内存并更改向量的大小。

 void multiply(int n) {
       multMat.resize(n);
       for (auto&& i : multMat) {
             i.resize(n);
       }
       ... rest of the code ...
  }

std::vector::operator[]不执行边界检查。因此,如果您在允许范围之外指定索引并尝试为返回的引用分配某些内容,则会发生未定义的行为。使用std::vector::at()来确保您的索引始终有效。