Делать
int m[3][4] = {0};
create_matrix(*m);
эквивалентно
int m[3][4] = {0};
create_matrix(m[0]);
, поэтому эквивалентно наличию
int m[4] = {0};
create_matrix(m);
// 'total' will be 70 = 10 * 7
int total = sizeof(matrix);
матрицы - это int *
, sizeof(matrix)
значения 4, если адрес использует 32b и 8, если адрес использует 64b
Эффективный размер матрица в main не имеет значения
// 'column' will be 7 = size of first row
int column = sizeof(matrix[0]);
matrix[0]
- это int , поэтому вы получите размер int (4 или 8, вероятно)
matrix[i][j] = k++;
, поскольку matrix является int * форма matrix[i][j]
недопустима.
Чтобы назвать ее matrix бесполезно.
Ваша программа может быть:
#include <stdio.h>
void fill_matrix(int matrix[][4], size_t row) {
size_t i, j;
int k = 0;
for (i=0; i < row; i++) {
for (j=0; j < sizeof(matrix[0])/sizeof(int); j++) {
matrix[i][j] = k++;
}
}
}
int main(void) {
// Creating a custom matrix.
int m[3][4] = {0};
fill_matrix(m, sizeof(m)/sizeof(m[0]));
size_t i, j;
for (i=0; i < sizeof(m)/sizeof(m[0]); i++) {
for (j=0; j < sizeof(m[0])/sizeof(int); j++) {
printf("matrix[%d][%d] = %d\n", i, j, m[i][j]);
}
}
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra m.c
pi@raspberrypi:/tmp $ ./a.out
matrix[0][0] = 0
matrix[0][1] = 1
matrix[0][2] = 2
matrix[0][3] = 3
matrix[1][0] = 4
matrix[1][1] = 5
matrix[1][2] = 6
matrix[1][3] = 7
matrix[2][0] = 8
matrix[2][1] = 9
matrix[2][2] = 10
matrix[2][3] = 11
Возможно, это более заметно, если выинициализируйте каждую ячейку матрицы с i*10+j
, а не с k++
, в этом случае будет напечатано:
matrix[0][0] = 0
matrix[0][1] = 1
matrix[0][2] = 2
matrix[0][3] = 3
matrix[1][0] = 10
matrix[1][1] = 11
matrix[1][2] = 12
matrix[1][3] = 13
matrix[2][0] = 20
matrix[2][1] = 21
matrix[2][2] = 22
matrix[2][3] = 23