Я объявил символ массива ** прибытие; Как инициализировать память для 2D массива символов.
Вам может быть лучше с одномерным массивом:
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);
Один из способов - сделать следующее:
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);
Я думаю, что это самый простой способ делать что-то и соответствует тому, что вам нужно.
Есть два варианта выделения массива типа 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]