В C нет двойных скриптов; Есть только массивы массивов. Например. это:
int a[3][3];
Должен читаться как «массив из 3 массивов по 3 дюйма», а не как «массив из 3х3 дюйма». Это сразу видно по типам выражений - например, a[0]
является допустимым выражением, и его тип int[3]
.
Для типов массивов размер массива является частью типа и поэтому должен быть известен во время компиляции. Поэтому, хотя вы можете иметь тип «указатель на массивы», чтобы сделать одно измерение динамическим, оставшиеся все равно должны быть исправлены:
int (*p)[3] // pointer to arrays of 3 ints each
Существует два традиционных обходных пути:
Просто используйте одномерный динамический массив из элементов width x height и рассчитайте 1D-индексы из 2D-координат как (y * width + x)
самостоятельно.
Использовать указатель на указатели:
int** a = malloc(sizeof(int*) * height);
for (i = 0; i < height; ++i) a[i] = malloc(sizeof(int) * width);
a[0][0] = 123;
...
Проблема в том, что ваш массив больше не должен быть прямоугольным, и вы не можете его принудительно применить. С точки зрения производительности это также хуже, чем один непрерывный блок памяти.
В C99 вы также можете использовать массивы переменной длины:
void foo(int width, int height) {
int a[width][height];
...
}