Возвращает 2d-массив и передает его в качестве аргумента другой функции

#arrays #c #xcode #matrix #2d

#массивы #c #xcode #матрица #2d

Вопрос:

Я новичок в C, я хотел бы задать вопрос об использовании функций в C.

Мне нужно создать две функции, первую для создания 2D-массива, а вторую для его печати. Я использую файл с именем matrix.c, заголовок с именем matrix .h и основной файл.

Основной файл выглядит следующим образом:

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

int main() {
int m, n;
printf("Insert rows and colums of matrix A: ");
scanf("%d%d", amp;m,amp;n);
printf("Insert elements of the first matrix An");
int A[m][n];
A[m][n] = **create(m, n);
display(m, n, A[m][n]);

return 0;
}
  

Файл matrix.c:

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

int **create(int m, int n){
    int  **A = (int **) malloc (sizeof(int *)*m);
    for (int i = 0; i < m; i  ){
        A[i]=(int *)malloc(sizeof(int)*n);
        for (int j = 0; j < n; j  ){
            printf("Element ");printf("%d", i 1);printf("%d", j 1);printf(":");
            scanf("%d",amp;A[i][j]);
        }
    }
    return A;
}


void display(int m, int n, int A[m][n]){
    for (size_t i = 0; i < m; i  ){
        for (size_t j = 0; j < n; j  ){
            printf("%d ", A[i][j]);
        }
        printf("n");
    }
}
  

Наконец, файл matrix.h выглядит следующим образом:

 #ifndef matrices_h
#define matrices_h
#include <stdio.h>

int **create(int m, int n);
void display(int m, int n, int A[m][n]);

#endif
  

Ошибка, которую возвращает мой компилятор, связана со строкой

 display(m, n, A[m][n]);
  

в основном файле. В нем говорится: поток 1: EXC_BAD_ACCESS (code = 1, address= 0x7ffe0000001a).
Более того, у меня есть еще одно предупреждение:
Несовместимое преобразование целого числа в указатель, передающее ‘int’ в параметр типа ‘int ( *)[ * ]’
(в той же строке).

Я благодарю всех, кто будет достаточно любезен, чтобы помочь мне 🙂

Ответ №1:

Вы не выделяете 2D-массив. Вы создаете одномерный массив указателей, а затем каждый из них указывает на одномерный массив int . Поэтому вы должны изменить код, чтобы использовать этот тип «double int pointer» повсюду.

Нравится:

 int A[m][n];              --> int **A;
A[m][n] = **create(m, n); --> A = create(m, n);
display(m, n, A[m][n]);   --> display(m, n, A);
  

и

 void display(int m, int n, int A[m][n]){ --> void display(int m, int n, int** A){