динамическая память для 2D массива символов

Я объявил символ массива ** прибытие; Как инициализировать память для 2D массива символов.

7
задан Ankur 10 April 2010 в 17:32
поделиться

3 ответа

Вам может быть лучше с одномерным массивом:

char *arr = calloc(WIDTH*HEIGHT, sizeof(arr[0]));

for (int y=0; y<HEIGHT; y++)
    for (int x=0; x<WIDTH; x++)
        arr[WIDTH*y+x] = 2*arr[WIDTH*y+x];

free(arr);
3
ответ дан 6 December 2019 в 07:50
поделиться

Один из способов - сделать следующее:

char **arr = (char**) calloc(num_elements, sizeof(char*));

for ( i = 0; i < num_elements; i++ )
{
    arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}

Совершенно ясно, что здесь происходит - сначала вы инициализируете массив указателей, затем для каждого указателя в этом массиве вы выделяете массив символов.

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

for ( i = 0; i < num_elements; i++ )
{
    free(arr[i]);
}

free(arr);

Я думаю, что это самый простой способ делать что-то и соответствует тому, что вам нужно.

10
ответ дан 6 December 2019 в 07:50
поделиться

Есть два варианта выделения массива типа char **

Я записал эти два примера кода из comp.lang.c FAQ (который также содержит хорошую иллюстрацию этих двух типов массивов)

Вариант 1 - Сделайте одно выделение для каждой строки ] плюс один для указателей строк.

char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
for(i = 0; i < nrows; i++)
  array1[i] = malloc(ncolumns * sizeof(char));  // Allocate each row separately

Вариант 2 - Выделить все элементы вместе и выделить указатели строк:

char **array2 = malloc(nrows * sizeof(char *));      // Allocate the row pointers
array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
for(i = 1; i < nrows; i++)
  array2[i] = array2[0] + i * ncolumns;

Вы также можете выделить только один блок памяти и использовать некоторую арифметику, чтобы получить элемент [i, j] . Но тогда вы использовали бы char * , а не char ** , и код усложнился. например arr [3 * ncolumns + 2] вместо arr [3] [2]

8
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: