fun
определяется как получение указателя на массив переменного размера или n
int
. Это синтаксис C 10 c, который может не поддерживаться некоторыми компиляторами C. Вы также могли бы определить fun
с более простым и более читаемым прототипом, который фактически эквивалентен:
void fun(int m, int n, int arr[m][n]);
Также эквивалентен этому:
void fun(int m, int n, int arr[][n]);
Проблема заключается в том, что вы выделяете совсем другой тип объекта: массив m
указателей на массивы n
int
. Вместо этого вы должны выделить массив m
массивов переменного размера n
int
и сохранить его адрес в указателе с соответствующим типом:
int (*arr)[n] = malloc(m * sizeof(*arr));
Или просто определить его как двумерную переменную размером массив с автоматами c хранилище:
int arr[m][n];
Если выделить с помощью malloc()
, вы освободите объект с помощью
free(arr);
Вот модифицированная версия:
#include <stdio.h>
#include <stdlib.h>
void fun(int m, int n, int arr[m][n]);
int main(void) {
int i, j, m, n;
printf("Enter the dimensions m, n\n");
if (scanf("%d %d", &m, &n) != 2 || m <= 0 || n <= 0)
return 1;
int (*arr)[n] = malloc(m * sizeof(*arr));
if (arr == NULL)
return 1;
fun(m, n, arr);
printf("\n\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%5d", arr[i][j]);
}
printf("\n");
}
free(arr);
return 0;
}
void fun(int m, int n, int arr[m][n]) {
int i, j, k = 0;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
k = k + 1;
arr[i][j] = k;
}
}
}