1. Функція для динамічного виділення пам’яті malloc().Прототип функціїmalloc():
void *malloc(unsigned s) — повертає вказівник на початок області динамічної пам’яті довжиною s байт. Якщо потрібний об’єм пам’яті функція не може виділити, то вона повертає NULL, або аргумент її =0, тобто s=0.
Приклад:
int *u;
u=(int*)malloc(sizeof(int)); // у функцію передається кількість необхідної пам'яті в байтах. Оскільки функція повертає значення типу void*, то його необхідно перетворити до типу вказівника (int*).
Приклад виділення пам’яті функцією malloc().
#include <stdio.h>
#include <stdlib.h>
int k, m, int *ptr1;
void main() { /*Виділяється 4*k байт пам¢яті, одержуємо адресу виділеного блоку */
for (k=1; k<=6; k=k+1) {ptr1= malloc(4*k);
m=(ptr1+k-1); Додається розмір, кратний байтам
printf("k=%d %d %d\n", k, ptr1, m+3); }
2. Функція динамічного виділення пам’яті calloc().Прототип функції:
Void *calloc(unsigned n, unsigned m) - повертає вказівник на початок області динамічної пам’яті для розміщення n елементів довжиною m байт кожний. Якщо потрібний об’єм пам’яті функція не може виділити, то вона повертає NULL, або аргументи її =0, тобто n =0 або m=0.
Приклад програми використання функції calloc():
#include <stdio.h>
#include <stdlib.h>
int k, m, int *ptr1;
void main() / Виділяється 4*16 байт пам¢яті, одержуємо адресу виділеного блоку*/
ptr1= calloc(4,16);
printf("%d %d \n", current, current+1 );} Початок кінець
Результат 40240672 40240676
3. Розширення динамічної пам’яті за допомогою функції realloc().Прототип функції:
void *realloc (void *p, unsigned s)
Функція змінює розмір блоку раніше виділеної динамічної пам’яті до розміру s байт, р - адреса початку змінюваного блоку, при невдалому завершенні повертає NULL;
Аргумент ptr вказує на ново виділений блок пам’яті. Новий розмір в байтах вказується параметром s. При виклику realloc() можливі такі випадки.
- Якщо для розширення блоку, який знаходиться за адресою ptr є достатня кількість пам’яті, то вона виконується і функція повертає ptr.
- Якщо пам’яті не досить, щоб розширити існуючий блок по його текучій адресі, то створюється новий блок потрібного розміру s і дані копіюються з старого блоку в початок нового. Старий блок звільняється і функція повертає вказівник на новий блок пам’яті.
- Якщо аргумент = NULL, то функція діє так як і malloc(), виділяючи блок пам’яті розміром sбайт і повертаючи вказівник на нього.
- Якщо аргументsize=0, блок пам’яті по адресі ptr звільняється і функція повертає NULL.
- Якщо для перерозподілу недосить пам’яті (тобто не можна ні розширити старий блок, ні розмістити новий), функція повертає NULL, а початковий блок стає незмінним.
Приклад використання функції для перерозподілу пам’яті:
4. Звільнення пам’яті з допомогою функції free().Пам’ять розподіляється з динамічної області. При розподілу пам¢яті за допомогою функцій malloc() і calloc() ця пам¢ять береться з динамічної області, яка доступна програмі. Але вона має межі. Коли програма закінчила роботу з блоком динамічно виділеної пам’яті, її треба звільнити. Звільнену пам’ять можна далі динамічно розподіляти. Для звільнення динамічно розподіленої пам’яті використовується функція free().
Прототип функції:
void free(void *ptr);
Функція звільняє раніше виділену ділянку динамічної пам'яті, на яку вказує адреса р. Цей блок повинен бути раніше виділений однією з функцій malloc(), realloc() і calloc(). Якщо вказівник рівний NULL функція нічого не дає. Приклад звільнення динамічного розподілу пам’яті.
#include <stdio.h>
#include <stdlib.h>
int int *ptr1;
void main() { /*Виділяється 4*k байт пам¢яті, одержуємо адресу
ptr1= malloc(100);
free(ptr1); /* Звільнення блоку пам¢яті по адресу ptr1*/ }