Статичні масиви зручні. Ви їх повідомляєте, вони просто лежать там, і ви молитеся, щоб не помилитися з розміром. Але що відбувається, коли вхідні дані змінюються? Ось тут на сцену виходять динамічні структури даних. Вони ростуть і стискаються на вимогу, виділяючи пам’ять з купи (heap) рівно тоді, коли це потрібно, і повертаючи її, коли вона більше не потрібна.

У C це не просто зручність. Це необхідність контролю споживання пам’яті. Ви не просто зберігаєте дані; ви керуєте фізичним простором, що вони займають.

Як купа забезпечує гнучке розподіл пам’яті

Уявіть купу, як загальний пул. На відміну від стека, який є жорстким і швидким, купа гнучка, але вимагає ручного управління. Динамічні структури даних працюють, захоплюючи шматки з цієї купи в міру потреби. Вони не просто лежать поряд один з одним у пам’яті. Вони зв’язуються між собою за допомогою покажчиків, утворюючи ланцюги, дерева чи списки.

Коли блок більше не потрібний, він повертається до купи. Ця переробка – ключовий момент. Це означає, що ви не витрачаєте оперативну пам’ять на порожні комірки у масиві фіксованого розміру. Ви використовуєте тільки те, що вимагає програма в конкретну секунду.

Ефективне використання пам’яті – це не про економію місця. Це про уникнення крашу, що відбувається, коли місце закінчується.

Щоб по-справжньому зрозуміти, як це працює, потрібно зрозуміти саму купу. Це є фундамент. Без неї покажчики – це просто плаваючі посилання нікуди. З нею ви будуєте структури, що адаптуються.