Ошибка сегментации при передаче многомерных массивов функциям в C - PullRequest
0 голосов
/ 17 ноября 2018

Мы видели передачу массивов функциям с помощью указателей в моем вступлении.в класс С, и я пытаюсь научиться самостоятельно передавать многомерные массивы.Я попытался написать функцию для присвоения значений элементов матрицы локальному массиву, но я получил ошибку сегментации.Я надеялся, что кто-нибудь сможет объяснить, почему это происходит и как это исправить.Я использую терминал на macOS Sierra.Заранее спасибо.Мой код ниже:

#include <stdio.h>
#include <stdlib.h>

void fillMatrix();

int main(void){
    int rows, cols;

    printf("\nEnter the number of columns:\n");
        scanf("%d", &cols);
    printf("\nEnter the number of rows:\n");
        scanf("%d", &rows);

    int matrix[rows][cols];


    fillMatrix(&matrix[rows][cols], rows, cols);

    for (int i = 0; i < rows; ++i){
        for (int j = 0; j < (cols - 1); ++j){
            printf("%d ", matrix[i][j]);
        } printf("%d\n", matrix[i][(cols -1)]);
    }
    return 0;
}

void fillMatrix( int *matrix, int rows, int cols ){
    for (int i = 0; i < rows; ++i){
        for (int j = 0; j < cols; ++j){
            printf("\nPlease enter the A(%d,%d) entry:\n", i, j);
                scanf("%d", &*(matrix + (i*cols) + j));
        }
    }
    return;
}

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

В C, когда вы объявляете массив, вам нужно указать его размер во время компиляции.Когда вы замедляете массив в строке

    int matrix[rows][cols];

Вы фактически инициализируете его размер мусорными значениями.В случае моего компилятора он был инициализирован с размером [0] [0].Чтобы достичь желаемого, вам нужно выполнить одно из двух действий:

  1. Указать явно, какой размер массива перед компиляцией
  2. Динамически выделить место для массива
0 голосов
/ 17 ноября 2018

С учетом объявления

int matrix[rows][cols];

Этот код неверен:

fillMatrix(&matrix[rows][cols], rows, cols);

Адрес &matrix[rows][cols] находится за концом матрицы.

первый элемент матрицы - &matrix[0][0], а последний элемент матрицы - &matrix[rows-1][cols-1].

Кроме того, это объявление

void fillMatrix();

вызовет проблемы с этим определением:

void fillMatrix( int *matrix, int rows, int cols ){
    ...

Они должны совпадать.Прямо сейчас, из-за объявления void fillMatrix() вверху, аргументы передаются функции через продвижение аргументов по умолчанию , но, поскольку определение имеет явные аргументы, сама функция ожидает аргументыдолжен быть передан как int * или int.У вас, вероятно, нет проблем с этим, так как значения по умолчанию для этих аргументов, вероятно, совпадают с этими аргументами, но определения и объявления функций обычно должны точно соответствовать.

Я не исследовалВаш код для других вопросов.

...