簡體   English   中英

傳遞多維數組時出現分段錯誤,C ++

[英]Segmentation fault while passing multidimensional arrays, c++

我對使用C ++進行編碼非常陌生,因此如果這個問題有一個非常明顯的簡單答案,我深表歉意。 我正在嘗試創建一個從-1到1的隨機數矩陣。這是我正在使用的兩個函數:

#include <iostream>
#include "matrix_fill_random.cpp"
using namespace std;

int main(int argc, int argv[]){

int n1, n2, n3;

if (argc != 4) {
    cerr << "This program requires 3 argument!" <<endl;
    return 1;
}
else{
    n1 = argv[1];
    n2 = argv[2];
    n3 = argv[3];

    double** a;

    matrix_fill_random(n1, n2, a);

    return 0;
}
}

#include <iostream>
using namespace std;

int matrix_fill_random(int n1, int n2, double** a){
for (int i=0; i<n1; i++){
    for (int j=0; j<n2; j++){
        double num = rand() % 2 - 1;
        a[i][j]=num;
    }
}
return 0;
}

最終,我嘗試創建兩個矩陣,然后將它們相乘,以便n1,n2和n3代表兩個矩陣的行和列,但是現在這並不是太重要。 我認為錯誤可能出在我如何聲明變量或將其傳遞給其他函數的問題上,但我不確定。

我覺得如果我能理解創建矩陣之一的原理,那么它將轉化為我需要使用的其他函數。

double** a;

您尚未為指針分配內存,因此,每次使用operator []取消引用它時,都會得到Undefined Behavior。

您應該分配a將其通過該功能前一次...

double** a = new double*[n1];

並再次在該函數的for循環內:

for (int i = 0; i < n1; i++)
{
    a[i] = new double[n2];
    for (int j = 0; j < n2; j++)
    {
        double num = rand() % 2 - 1;
        a[i][j] = num;
    }
}

但是,一旦使用完畢,不要忘記delete[]指針。 您還應該delete在for循環內分配的其他指針。

當然,這可以通過使用std::vector來避免。 這是裝有標准庫的程序:

std::vector<std::vector<double>> a(n1, std::vector<double>(n2));

int matrix_fill_random(std::vector<std::vector<double>> a)
{
    for (int i = 0; i < a.size(); ++i)
    {
        for (int j = 0; j < a[i].size(); ++j)
        {
            double num = rand() % 2 - 1;
            a[i][j] = num;
        }
    }
    return 0;
}

分配的內存a 您尚未為a分配內存。 將語句改為double** a;

  double** a = new double[n1];

並如下更改循環

  for (int i = 0; i < n1; i++)
  {
    //Every row will be of size = number of columns.
    a[i] = new double[n2];
    for (int j = 0; j < n2; j++)
    {
        double num = rand() % 2 - 1;
        a[i][j] = num;
    }
  } 
double** a;
matrix_fill_random(n1, n2, a);

將未初始化的指針a傳遞給該函數,該函數嘗試初始化二維數組的元素:

a[i][j]=num;

這將引發未定義的行為 最簡單的解決方案是分配一個足以容納矩陣的內存塊:

double* a = new double[rows * cols];
matrix_fill_random(n1, n2, a);
delete[] a;
a = NULL;

...

// accessing element a[i][j] in the function's body:
a[i*cols + j] = num;

但最合理的解決方案是使用std::vector而不是C樣式的數組。

您需要先將內存分配給a然后再將其傳遞給matrix_fill_random()

double** a = new double[n1];

由於您使用的是C ++,因此應該考慮使用vector或其他模板容器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM