Я генерирую смежные 2-мерные массивы, используя метод, опубликованный здесь Шоном Чином. [1] [2] Работает очень хорошо.
Кратко из своего поста:
char** allocate2Dchar(int count_x, int count_y) {
int i;
# allocate space for actual data
char *data = malloc(sizeof(char) * count_x * count_y);
# create array or pointers to first elem in each 2D row
char **ptr_array = malloc(sizeof(char*) * count_x);
for (i = 0; i < count_x; i++) {
ptr_array[i] = data + (i*count_y);
}
return ptr_array;
}
И следующая бесплатная функция:
void free2Dchar(char** ptr_array) {
if (!ptr_array) return;
if (ptr_array[0]) free(ptr_array[0]);
free(ptr_array);
}
Для меня не очевидно, как создать эквивалентную функцию перераспределения в любом измерении, хотя меня интересует только перераспределение количества строк при сохранении непрерывности. Увеличение количества столбцов было бы интересно понять, но, вероятно, довольно сложно. Я не нашел прямого обсуждения этого вопроса нигде, кроме как сказать «это сложно!». [2]
Конечно, это выполнимо методом ужасной грубой силы, копируя данные в новый одномерный массив (данные выше) для хранения, перераспределяя одномерный массив, затем освобождая и восстанавливая указатели (ptr_array) на строку элементы для нового размера. Это, однако, довольно медленно для модификаций строк, поскольку необходимо по крайней мере удвоить требование к памяти для копирования данных, и это действительно ужасно плохо для изменения количества столбцов.
Это пример упомянутого метода для изменения количества строк (он не будет работать должным образом для изменения количества столбцов, потому что смещения для указателей будут неправильными для данных). Я не полностью проверил это, но вы поняли ...
double **
reallocate_double_array (double **ptr_array, int count_row_old, int count_row_new, int count_col)
{
int i;
int old_size = count_row_old * count_col;
int new_size = count_row_new * count_col;
double *data = malloc (old_size * sizeof (double));
memcpy (&data[0], &ptr_array[0][0], old_size * sizeof (double));
data = realloc (data, new_size * sizeof (double));
free (ptr_array[0]);
free (ptr_array);
ptr_array = malloc (count_row_new, sizeof (double *));
for (i = 0; i < count_row_new; i++)
ptr_array[i] = data + (i * count_col);
return ptr_array;
}
Плюс, этот метод требует, чтобы вы знали предыдущий размер, что неприятно!
Любые мысли с благодарностью.
[1] Как выделить двумерный массив с помощью двойных указателей?
[2] http://www.eng.cam.ac.uk/help/tpl/languages/C/teaching_C/node52.html