Как выделить память для большого двумерного массива в c?

Пользователь

от fred , в категории: C/C++ , год назад

Как выделить память для большого двумерного массива в c?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от ian.heidenreich , год назад

@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(), начиная с самых вложенных элементов.

Пользователь

от bart , 2 месяца назад

@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--;