Для уточнения предположим, что вы заявляете:
int my_static_array[row][col];
Какой тип my_static_array против массива malloc (назовем его массивом my_malloc) в ответе pmg? my_static_array - это непрерывная строка * col * sizeof (int) числа байтов в памяти, с указателем int * на ее начало. При вычислении my_static_array [x] [y] компилятор знает, что делать (потому что они хранятся в мажорном порядке ):
*(addr(my_static_array) + [sizeof(int)*col*x] + [sizeof(int)*y])
Вот почему мне нужно передать значение col для C:
(1) func(int my_static_array[][col])
(2) func(int my_static_array[][])
В (1) компилятор знает, как правильно рассчитать адрес для статического массива. В (2) компилятору не хватает информации. Вот почему (1) компилируется, а (2) не будет.
Однако, если это массив malloc, можно передать:
func(int** my_malloc_array)
Поскольку это указатель на непрерывный массив одномерных массивов, компилятору не требуется помощь. my_malloc_array [x] [y] выполняется просто:
*(*(addr(my_malloc_array)+x)+y)
Компилятору не нужна никакая другая информация о его размерности для вычисления.
Итак, какой урок? 2D-массивы NOT совпадают с массивом указателей на одномерные массивы. Первый имеет тип int (* my_static_array) [row * col] - указатель на массив row * col элементов, последний имеет тип int ** - указатель на массив row указатели.