Вы выделили память для первого измерения, но не второго.
size_t rows = 10;
size_t cols = 10;
int **array = malloc(sizeof *array * rows); // allocates array of 10 int *
if (array)
{
size_t i;
for (i = 0; i < rows; i++)
{
array[i] = malloc(sizeof *array[i] * cols); // allocates array of 10 int
if (array[i])
{
size_t j;
for (i = 0; i < cols; i++)
array[i][j] = i * j;
}
}
}
Обратите внимание, что это не выделяет непрерывный блок памяти; если вам нужно, чтобы все 100 элементов были смежными, у вас есть несколько вариантов:
Вариант 1: выделить 1-D массив и вычислить смещения вручную, как показали несколько других;
Вариант 2: выделить 1-D массив и использовать указатель массива и некоторую магию приведения, чтобы он выглядел как 2-D массив:
#define COLS 10
size_t rows = 10;
size_t cols = COLS;
int *array = malloc(sizeof *array * rows * cols);
int (*parr)[COLS] = (int (*)[COLS]) array;
if (array)
{
size_t i, j;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
parr[i][j] = i * j;
}
Недостатком является то, что для объявления указателя необходимо знать, сколько столбцов вы работаете, а для C89 вы должны использовать константное выражение времени компиляции для измерения столбца, что в некоторой степени противоречит цели динамического распределение (использование переменной cols
не сработает, если вы не используете компилятор C99).
Вариант 3: Если вы используете C99, вы можете использовать VLA и вообще избегать malloc
(и сопровождающего free
):
int rows = ROWS;
int cols = COLS;
int array[rows][cols];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
array[i][j] = i * j;