Урок 22: Динамическая память — stack, heap и malloc
До сих пор все наши переменные жили в стеке (stack): они создаются автоматически, их размер задан заранее, и они исчезают, когда функция завершается. Иногда этого недостаточно — например, когда нужен массив, размер которого известен только во время выполнения. Для этого и существует куча (heap): вы
Стек — как поднос в столовой: вы получаете его автоматически, и его забирают в конце обеда, не спрашивая. Куча — как склад с арендой ячеек: вы просите ячейку любого размера, который выберете (malloc), получаете ключ (указатель), и ячейка ваша — пока вы не вернёте ключ (free). Потеряете ключ, не вернув его, — и ячейка останется занятой.
- стек (stack)
- Область автоматической памяти: локальные переменные живут здесь и исчезают, когда функция завершается. Их размер должен быть задан заранее.
- куча (heap)
- Область памяти, у которой вы запрашиваете блоки во время выполнения. Что попросили, то вы обязаны освободить с помощью free.
- malloc(size)
- Запрашивает блок из size байт из кучи и возвращает его адрес или NULL при неудаче. Требует #include <stdlib.h>.
- free(p)
- Возвращает блок, на который указывает p, обратно в кучу. Каждому malloc нужен один free, когда вы закончили.
- проверка на NULL
- Сразу после malloc проверьте if (p == NULL) — когда свободной памяти недостаточно, malloc возвращает NULL, и указатель нельзя использовать.