Статические массивы удобны. Вы их объявляете, они просто лежат там, и вы молитесь, чтобы не ошибиться с размером. Но что происходит, когда входные данные меняются? Вот здесь на сцену выходят динамические структуры данных. Они растут и сжимаются по требованию, выделяя память из кучи (heap) ровно тогда, когда это нужно, и возвращая её, когда она больше не требуется.
В C это не просто удобство. Это необходимость для контроля потребления памяти. Вы не просто храните данные; вы управляете физическим пространством, которое они занимают.
Как куча обеспечивает гибкое распределение памяти
Представьте кучу как общий пул. В отличие от стека, который жёсткий и быстрый, куча гибкая, но требует ручного управления. Динамические структуры данных работают, захватывая куски из этой кучи по мере необходимости. Они не просто лежат рядом друг с другом в памяти. Они связываются между собой с помощью указателей, образуя цепи, деревья или списки.
Когда блок больше не нужен, он возвращается в кучу. Эта переработка — ключевой момент. Это означает, что вы не тратите оперативную память на пустые ячейки в массиве фиксированного размера. Вы используете только то, что требует программа в данную конкретную секунду.
Эффективное использование памяти — это не про экономию места. Это про избегание краша, который происходит, когда место заканчивается.
Чтобы по-настоящему понять, как это работает, нужно понять саму кучу. Это фундамент. Без неё указатели — это просто плавающие ссылки никуда. С ней вы строите структуры, которые адаптируются.































