Доступ к двумерному массиву вне main (), вызывающий ошибку сегментации во время выполнения? - PullRequest
1 голос
/ 07 февраля 2020

Попытка доступа к stati c массиву в функции fill() путем передачи ее адреса в качестве аргумента.

#include <iostream>
using namespace std;

void fill(int val, int n, int m, int **arr){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            arr[i][j] = val;
            arr[i][j] = val;
        }
    }
}

int main(){

    int n = (cin>>n, n);
    int m = (cin>>m, m);

    int arr[n][m];
    fill(1, n, m, (int**)arr);
}

Если нам не разрешено чтобы получить доступ к массиву arr[n][m] 2-D вне функции main (), приведя его к двойному указателю, каков правильный способ доступа к этой памяти вне main()?

Решение:

void fill(int val, int n, int m, int *arr){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            *(arr + i * m + j) = val;
        }
    }
}

int main(){

    int n = (cin>>n, n);
    int m = (cin>>m, m);

    int arr[n][m];
    fill(1, n, m, &arr[0][0]);
}

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Что касается массивов переменного размера, то прочитайте Почему массивы переменной длины не являются частью стандарта C ++?

Поскольку вы используете C ++, я бы посоветовал один из контейнеров, предоставленных язык для хранения ваших данных, в данном случае вектор векторов.

Live Sample

#include <iostream>
#include <vector>

using namespace std; // for test purposes shouldn't be used

void fill(int val, int lines, int cols, vector<vector<int>>& matrix){
    for (int i = 0; i < lines; i++){
        vector<int> v;
        for (int j = 0; j < cols; j++)
            v.push_back(val);
        matrix.push_back(v);
    }
}

int main() {

    int lines, cols; 
    vector<vector<int>> matrix;

    cout << "lines and columns: " << endl;
    cin >> lines >> cols;

    fill(1, lines, cols, matrix);
}

Если вы должны использовать массивы, то я бы посчитал, что лучше способ заключается в динамическом распределении памяти, C стиль:

Live Sample

#include <iostream>   

using namespace std; // for test purposes, shouldn't be used

void fill(int val, int n, int m, int *arr){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            *(arr+i+j) = val;
        }
    }
}

int main(){

    int n, m;
    cout << "lines and columns: " << endl;
    cin >> n >> m;

    int* arr = (int*) malloc(sizeof(*arr) * n * m) ;
    fill(1, n, m, arr);
}
0 голосов
/ 07 февраля 2020

int arr [] [] не является int **.

Если вам нужен массив Dynami c, вы можете использовать векторные:

#include <iostream>
#include <vector>

using namespace std;

void fill(int val, int n, int m, vector<vector<int>>& arr) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      arr[i][j] = val;
      arr[i][j] = val;
    }
  }
}

int main() {

  int n = (cin >> n, n);
  int m = (cin >> m, m);

  vector<vector<int>> arr;
  arr.resize(n);
  for (auto row = arr.begin(); row != arr.end(); ++row) {
    row->resize(m);
  }
  fill(1, n, m, arr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...