Урок 23: calloc, realloc и динамические массивы
На прошлом уроке мы познакомились с malloc — она выделяет блок, но оставляет в нём мусор. calloc(n, size) идёт на шаг дальше: она выделяет И обнуляет каждый байт. realloc(p, new_size) меняет размер существующего блока — увеличивая или уменьшая его — но осторожно: она может переместить блок по новому
realloc — это как переезд в более просторную ячейку хранения: транспортная компания может перевезти все ваши вещи в новую ячейку в другом месте и вручить вам новый ключ. Никогда не выбрасывайте старый ключ, пока новый не окажется у вас в руке — иначе, если переезд сорвётся, вы потеряете и старую ячейку тоже.
- calloc(n, size)
- Выделяет блок для n элементов по size байт каждый — и также обнуляет каждый байт.
- realloc(p, new_size)
- Меняет размер существующего блока. Значения сохраняются, но блок может переместиться по новому адресу.
- временный указатель (tmp)
- Безопасный шаблон: int *tmp = realloc(arr, ...); и только если tmp не NULL — arr = tmp;. Так исходный блок не теряется при неудаче.
- ёмкость (capacity)
- Сколько элементов может вместить блок. В динамическом массиве, когда ёмкость исчерпана — принято удваивать её с помощью realloc.
- динамический массив
- Массив в куче, размер которого задаётся во время выполнения и может расти по мере необходимости — в отличие от обычного массива фиксированного размера.