Как создать во время выполнения двумерный массив в C - PullRequest
3 голосов
/ 17 сентября 2011

Я не могу создать двумерный массив из 2 переменных (например, int arr[i][j] не разрешен), так как бы мне создать двумерный массив динамического размера?

Размеры массива известны только во время выполнения в моей программе,Массив должен представлять сетку.Как бы я кодировал это в C?

Ответы [ 5 ]

10 голосов
/ 17 сентября 2011

Сначала выделите массив указателей

/* size_x is the width of the array */
int **array = (int**)calloc(size_x, sizeof(int*));

Затем выделите каждый столбец

for(int i = 0; i < size_y; i++) {
    /* size_y is the height */
    array[i] = (int*)calloc(size_y, sizeof(int));
}

Доступ к элементам можно получить с помощью array[i][j].Освобождение памяти производится в обратном порядке:

for(int i = 0; i < size_y; i++) {
    free(array[i]);
}
free(array);
7 голосов
/ 17 сентября 2011

Вы должны выделить одномерный массив:

int* array = calloc(m*n, sizof(int));

И обращаться к нему так:

array[i*n + j]

Компилятор делает именно это при доступе к двумерным массивам, ивероятно выведет тот же код, когда n может быть угадан во время компиляции.

1 голос
/ 17 сентября 2011

Это часто задаваемые вопросы о comp.lang.c (я позволил себе добавить тег c-faq), у него даже есть FGA (часто дается ответ :-) См. http://c -faq.com/aryptr/index.html, 6.16 Как я могу динамически выделить многомерный массив?

0 голосов
/ 17 сентября 2011

В некоторых примерах показано несколько (более 2) выделений для массива;вполне возможно сделать это всего за два выделения (проверка ошибок исключена) для массива n × m:

int **array = calloc(m, sizeof(*array));
int *data   = calloc(m * n, sizof(*data));

for (int i = 0; i < m; i++)
    array[i] = &data[i * n];


...use array[i][j]...

free(array[0]);
free(array);
0 голосов
/ 17 сентября 2011

В C многомерный массив - это просто массив, для которого каждый элемент является другим массивом.

Поэтому вам необходимо сначала выделить память для одного массива (строк).Вы можете использовать функцию malloc(), которая будет возвращать указатель на массив.

Затем вы перебираете массив и для каждого элемента выделяете память для количества столбцов.

ПРИМЕЧАНИЕ:не забудьте освободить память, выделенную вручную с помощью функции free() так же, как вы использовали malloc() для ее выделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...