Динамічний розподіл пам'яті в C — це спосіб ручного керування пам'ятю в мові програмування C за допомогою функцій стандартної бібліотеки, а саме malloc, realloc, calloc, aligned_alloc та free.
Попри те, що ці функції наявні в , автори закликають використовувати більш безпечні оператори та . Хоча існують винятки, де їх використання не рекомендується. Серед них, чутливі до продуктивності ділянки коду або реалізація прибиральника сміття.
Існує безліч механізмів перерозподілу пам'яті, що базуються на функції malloc. Вони можуть відрізнятися за швидкістю виконання чи споживанню пам'яті.
Огляд функцій
Функції динамічного розподілу пам’яті знаходяться у заголовку stdlib.h
( заголовок cstdlib
в C++).
функція | опис |
---|---|
malloc | виділяє вказану кількість байтів |
aligned_alloc | виділяє вказану кількість байтів із вказаним вирівнюванням |
realloc | збільшує або зменшує розмір зазначеного блоку пам'яті, переміщуючи його за необхідності |
calloc | виділяє вказану кількість байтів та заповнює її нулями |
free | звільняє вказаний блок пам'яті назад до системи |
Різниця між malloc()
та calloc()
malloc()
приймає один аргумент (обсяг пам’яті для виділення в байтах), тоді якcalloc()
приймає два аргументи — кількість елементів і розмір кожного елемента.malloc()
виділяє лише пам’ять, тоді якcalloc()
виділяє та заповнює данну область пам'яті нулями.
Приклад використання
Створення масиву в С з десяти цілих чисел є доволі простим:
int array[10];
Але розмір масиву визначається під час компіляції. Якщо потрібно виділити його динамічно та без використання масиву змінної довжини, який присутній не в всіх реалізаціях C11, можна використати такий код:
int *array = malloc(10 * sizeof(int));
Він обчислює кількість байтів, які десять цілих чисел займають у пам’яті, потім виділяє їх через функцію malloc
. Адреса виділеного блоку пам'яті зберігається у змінній array
(завдяки синтаксису C, вказівники та масиви в деяких ситуаціях можуть використовуватись рівнозначно). Оскільки функція malloc
не гарантує виділення пам'яті, вона може повернути нульовий вказівник у разі помилки. Перевіряти це в програмуванні вважається хорошою практикою:
int *array = malloc(10 * sizeof(int)); if (array == NULL) { fprintf(stderr, "malloc failed\n"); return -1; }
Після того, як динамічний масив більше не потрібен, потрібно викликати функцію free
, щоб звільнити пам'ять, яку він займає:
free(array);
Пам'ять, що виділена malloc
не є ініціалізована за замовчуванням та може містити залишки роботи попередніх програм. Тобто, елементи масиву виділеного за допомогою malloс
є . Функція calloc
повертає пам'ять, що очищується за замовчуванням.
int *array = calloc(10, sizeof(int));
За допомогою функції realloc
ми можемо змінити розмір пам’яті, яка вже була виділеною. Наприклад, якщо у нас є вказівник, що вказує на масив розміру і ми хочемо змінити його розмір на , ми можемо скористатися realloc
.
int *arr = malloc(2 * sizeof(int)); arr[0] = 1; arr[1] = 2; arr = realloc(arr, 3 * sizeof(int)); arr[2] = 3;
Варто зазначити, що realloc
може повернути вказівник на нову адресу. Тобто, якщо блок пам'яті, що належить вказівнику, не може бути розширеним, realloc
виділить новий блок пам'яті та зкопіює туди старі дані. Тоді попередній вказівник буде більше не дійсним.
Джерела
- Summit, Steve. Chapter 11: Memory Allocation. C Programming Notes. Процитовано 11 липня 2020.
- aligned_alloc(3) - Linux man page.
- Stroustrup, Bjarne (2008). Programming: Principles and Practice Using C++. Addison Wesley. с. 1009. ISBN .
- Linux Programmer's – Library Functions –
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Nemaye perevirenih versij ciyeyi storinki jmovirno yiyi she ne pereviryali na vidpovidnist pravilam proektu Dinamichnij rozpodil pam yati v C ce sposib ruchnogo keruvannya pam yatyu v movi programuvannya C za dopomogoyu funkcij standartnoyi biblioteki a same malloc realloc calloc aligned alloc ta free 1 2 Popri te sho ci funkciyi nayavni v C avtori zaklikayut vikoristovuvati bilsh bezpechni operatori new ta delete 3 Hocha isnuyut vinyatki de yih vikoristannya ne rekomenduyetsya Sered nih chutlivi do produktivnosti dilyanki kodu abo realizaciya pribiralnika smittya Isnuye bezlich mehanizmiv pererozpodilu pam yati sho bazuyutsya na funkciyi malloc Voni mozhut vidriznyatisya za shvidkistyu vikonannya chi spozhivannyu pam yati Zmist 1 Oglyad funkcij 1 1 Riznicya mizh malloc ta calloc 2 Priklad vikoristannya 3 DzherelaOglyad funkcijred Funkciyi dinamichnogo rozpodilu pam yati znahodyatsya u zagolovku stdlib h zagolovok cstdlib v C funkciya opis span class n malloc span vidilyaye vkazanu kilkist bajtiv span class n aligned alloc span vidilyaye vkazanu kilkist bajtiv iz vkazanim virivnyuvannyam span class n realloc span zbilshuye abo zmenshuye rozmir zaznachenogo bloku pam yati peremishuyuchi jogo za neobhidnosti span class n calloc span vidilyaye vkazanu kilkist bajtiv ta zapovnyuye yiyi nulyami span class n free span zvilnyaye vkazanij blok pam yati nazad do sistemi Riznicya mizh malloc ta calloc red malloc prijmaye odin argument obsyag pam yati dlya vidilennya v bajtah todi yak calloc prijmaye dva argumenti kilkist elementiv i rozmir kozhnogo elementa malloc vidilyaye lishe pam yat todi yak calloc vidilyaye ta zapovnyuye dannu oblast pam yati nulyami 4 Priklad vikoristannyared Stvorennya masivu v S z desyati cilih chisel ye dovoli prostim int array 10 Ale rozmir masivu viznachayetsya pid chas kompilyaciyi Yaksho potribno vidiliti jogo dinamichno ta bez vikoristannya masivu zminnoyi dovzhini yakij prisutnij ne v vsih realizaciyah C11 mozhna vikoristati takij kod int array malloc 10 sizeof int Vin obchislyuye kilkist bajtiv yaki desyat cilih chisel zajmayut u pam yati potim vidilyaye yih cherez funkciyu malloc Adresa vidilenogo bloku pam yati zberigayetsya u zminnij array zavdyaki sintaksisu C vkazivniki ta masivi v deyakih situaciyah mozhut vikoristovuvatis rivnoznachno Oskilki funkciya malloc ne garantuye vidilennya pam yati vona mozhe povernuti nulovij vkazivnik u razi pomilki Pereviryati ce v programuvanni vvazhayetsya horoshoyu praktikoyu int array malloc 10 sizeof int if array NULL fprintf stderr malloc failed n return 1 Pislya togo yak dinamichnij masiv bilshe ne potriben potribno viklikati funkciyu free shob zvilniti pam yat yaku vin zajmaye free array Pam yat sho vidilena malloc ne ye inicializovana za zamovchuvannyam ta mozhe mistiti zalishki roboti poperednih program Tobto elementi masivu vidilenogo za dopomogoyu mallos ye neinicializovanimi zminnimi Funkciya calloc povertaye pam yat sho ochishuyetsya za zamovchuvannyam int array calloc 10 sizeof int Za dopomogoyu funkciyi realloc mi mozhemo zminiti rozmir pam yati yaka vzhe bula vidilenoyu Napriklad yaksho u nas ye vkazivnik sho vkazuye na masiv rozmiru n displaystyle n nbsp i mi hochemo zminiti jogo rozmir na m displaystyle m nbsp mi mozhemo skoristatisya realloc int arr malloc 2 sizeof int arr 0 1 arr 1 2 arr realloc arr 3 sizeof int arr 2 3 Varto zaznachiti sho realloc mozhe povernuti vkazivnik na novu adresu Tobto yaksho blok pam yati sho nalezhit vkazivniku ne mozhe buti rozshirenim realloc vidilit novij blok pam yati ta zkopiyuye tudi stari dani Todi poperednij vkazivnik bude bilshe ne dijsnim Dzherelared Summit Steve Chapter 11 Memory Allocation C Programming Notes Procitovano 11 lipnya 2020 aligned alloc 3 Linux man page Stroustrup Bjarne 2008 Programming Principles and Practice Using C Addison Wesley s 1009 ISBN 978 0 321 54372 1 a rel nofollow class external text href http man7 org linux man pages man3 calloc 3 html calloc 3 a Linux Programmer s Manual Library Functions Otrimano z https uk wikipedia org wiki Dinamichnij rozpodil pam 27yati v C