Исходя из вашего описания, вы начинаете неправильно, поэтому к тому времени, когда вы начнете копировать вещи, вы ничего не сможете сделать, вероятно, сработает.
Сейчас вы уже определили new_array
(и, предположительно, array
) в качестве указателя на obj
.Результат выглядит следующим образом:
В этом случае у вас есть указатель на динамически размещенный массив объектов.Когда / если вы расширяете выделение, вам нужно будет скопировать все объекты сами.
Согласно вашему описанию: «(т.е. массивы указателей на структуры кучи)», вам нужен массив указателей,Если вы хотите выделить этот массив указателей автоматически, ваше определение будет выглядеть так:
obj *array[NUMBER];
Я думаю, что это не то, что вы хотите.Предположительно, вы хотите выделить этот массив также динамически.Это выглядело бы следующим образом:
В этом случае new_array
и array
каждый должен быть определен как указатель на указатель на obj
.Затем вы должны выделить массив указателей (т. Е. Указателей на столько obj
с, сколько хотите), и у каждой точки будет точка obj
:
obj **new_array;
// allocate an array of pointers with space to point at more items:
new_array = malloc(sizeof(obj *) * new_elements);
// copy the pointers to the current items to the new array:
for (i=0; i<current_elements; i++)
new_array[i] = array[i];
Преимущество этого состоит в том, чтокогда вы выполняете копирование, вы копируете только указатели , а не сами объекты.Особенно с большими объектами, это может сэкономить значительное количество усилий.Компромисс заключается в том, что использование элемента проходит через два уровня косвенного целочисленного значения, равного одному, поэтому ссылка может быть медленнее (хотя редко намного медленнее, особенно на относительно высокопроизводительном процессоре).
Как уже заметил @rerun, в любом случае вы, вероятно, захотите использовать realloc
.В частности, этот может быть в состоянии расширить распределение "на месте" и избежать частого копирования данных.Конечно, это не гарантировано, но, по крайней мере, вы даете этому шанс;если вы malloc
и копируете каждый раз, вы исключаете даже возможность такой оптимизации.