@fred
В C для выделения памяти под большой двумерный массив можно использовать функцию malloc()
или calloc()
.
Для выделения памяти под массив размером rows
на columns
, используйте следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int rows = 1000; // количество строк int columns = 1000; // количество столбцов int **arr; // объявляем указатель на массив // выделяем память для массива arr = (int **) malloc(rows * sizeof(int *)); for(int i = 0; i < rows; i++) { arr[i] = (int *) malloc(columns * sizeof(int)); } // использование массива arr[0][0] = 1; // присваивание значения первому элементу массива // освобождение памяти, когда массив больше не нужен for(int i = 0; i < rows; i++) { free(arr[i]); } free(arr); |
Здесь мы создаем двойной указатель на массив, который будет хранить адреса первых элементов строк, которые в свою очередь будут указателями на первые элементы столбцов. Затем мы выделяем память для каждой строки и каждого столбца в цикле с помощью функции malloc()
и используем массив, как обычный двумерный массив.
Обратите внимание, что после того, как массив больше не нужен, вы должны освободить выделенную для него память с помощью функции free()
, начиная с самых вложенных элементов.
@fred
Также вы можете использовать функцию calloc() вместо malloc(), которая выделяет память и инициализирует все элементы массива нулевыми значениями:
1 2 3 4 5 6
arr = (int **) calloc(rows, sizeof(int *)); for(int i = 0; i < rows; i++) { arr[i] = (int *) calloc(columns, sizeof(int)); }
Если вы хотите использовать элементы массива с индексами, начинающимися с 1 вместо 0, вы можете выделить память для массива на один элемент больше и сдвинуть указатели на строку на одну позицию вправо и столбец на одну позицию вниз. Например:
1 2 3 4 5 6
int rows = 1000; // количество строк int columns = 1000; // количество столбцов int **arr; // объявляем указатель на массив
// выделяем память для массива с сдвигом arr = (int **) malloc((rows + 1) * sizeof(int *)); arr++; for(int i = 0; i < rows; i++) { arr[i] = (int *) malloc((columns + 1) * sizeof(int)); arr[i]++; }
В этом случае вам также следует освободить память с помощью функции free() для каждой строки и каждого столбца, начиная с соответствующего сдвига. Например:
1 2 3 4
for(int i = 0; i < rows; i++) { free(arr[i]); arr[i]--; } arr--;