Функция realloc
может использоваться для увеличения или уменьшения массива. Когда массив увеличивается, существующие записи сохраняют свое значение, а новые записи не инициализируются. Это может либо расти на месте, либо, если это было невозможно, он может выделить новый блок в другом месте памяти (и за кадром скопировать все значения в новый блок и освободить старый блок).
Самая базовая форма:
// array initially empty
T *ptr = NULL;
// change the size of the array
ptr = realloc( ptr, new_element_count * sizeof *ptr );
if ( ptr == NULL )
{
exit(EXIT_FAILURE);
}
Умножение объясняется тем, что realloc
ожидает количество байтов, но вы всегда хотите, чтобы в вашем массиве было правильное количество элементов. Обратите внимание, что этот шаблон для realloc
означает, что вам не нужно повторять T
где-либо в вашем коде, кроме исходного объявления ptr
.
Если вы хотите, чтобы ваша программа могла восстанавливаться после сбоя выделения вместо выполнения exit
, вам нужно сохранить старый указатель вместо того, чтобы перезаписывать его NULL:
T *new = realloc( ptr, new_element_count * sizeof *ptr );
if ( new == NULL )
{
// do some error handling; it is still safe to keep using
// ptr with the old element count
}
else
{
ptr = new;
}
Обратите внимание, что сжатие массива с помощью realloc
может на самом деле не возвращать память операционной системе; память может по-прежнему принадлежать вашему процессу и доступна для будущих вызовов на malloc
или realloc
.