Різниця між динамічним масивом та нединамічним
динамічні масиви виділяються в стіковій пам'яті (локальні об'єкти, параметри функцій, що повертаються значення): - містить довільні значення; - може бути "корумпована" (пошкоджена); - час життя обмежений., а статичні в статичній пам'яті статичні масиви виділяються в статичній пам'яті(Статична (глобальні об'єкти, статичні змінні): - виділяється на етапі побудови (build-time); - розмір фіксований і обмежений; - розмір не може бути змінений під час виконання; - обнулюється. Різниця в тому, що дуже часто ми не знаємо розмір вихідного масиву або структури (і т.д.) Тому виділяємо пам'ять вже в процесі побудови програми, наприклад у створенні списків Ось функція, що створює список "книг"( у мене така структура) struct BOOK char title[30]; char author [30]; int pages; >; struct ITEM BOOK *book; ITEM *next; >;
ITEM *createList(BOOK *book) ITEM *head=(ITEM*)malloc(sizeof(ITEM)); // ITEM *head=new ITEM; //(З++) head-book=book; head->next=NULL; return head; >
Копіювання рядків Якщо робота з malloc() і free() така небезпечна, то, може бути, взагалі не варто користуватися цими функціями, а краще задавати масиви звичним способом: int p[1000000 ]? На жаль, пам'ять, зайняту таким масивом, не можна звільнити, крім того, не можна змінити і розмір масиву в процесі виконання програми. Тому кажуть, що так задається «статичний масив». Але далеко не завжди відомий точний розмір масиву, і щоб програма працювала, потрібно задавати його «із запасом», що негарно і марнотратно. На відміну від статичного масиву, завдання динамічного масиву за допомогою функції malloc() дозволяє виділити рівно стільки пам'яті, скільки потрібно, а функція free() звільняє пам'ять відразу ж, як тільки потреба в ній відпаде.
p.s. при побудові навіть найпростіших баз даних (не кажучи вже про хеш-таблиці з сотнями тисяч елементів) при вхідному потоці надходитимуть дані різної величини, і для створення статичних масивів не вистачатиме пам'яті, причому навіть ти не знатимеш, скільки пам'яті ці дані будуть позичати.
Я тобі тут взагалі говорю про динамічне виділення пам'яті, не тільки про масиви!
Статичним масивом називають набір даних, для зберігання якого перед початком функціонування програми виділяється фіксоване місце в пам'яті, що звільняється після завершення роботи програми.
На відміну від цього, місце для зберігання динамічних масивів виділяється і звільняється в процесі виконання програми. При динамічному розподілі пам'яті для масивів слід описати відповідний покажчик і надавати йому значення за допомогою функції calloc.(malloc) Динамічні масиви не можна під час створення ініціалізувати, і вони не обнулюються. Перевага динамічних масивів у тому, що й розмірність може бути константой.
До речі, ось виділення пам'яті під статичний масив: