Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи по програмуванні(14 лаб).doc
Скачиваний:
77
Добавлен:
16.05.2015
Размер:
1.43 Mб
Скачать

Теоретичні відомості Масиви динамічної пам'яті

При традиційному визначенні масиву:

Тип ім'я_масиву [кількість елементів] ;

Загальна кількість елементів масиву і розміри пам'яті, виділеної для нього, цілком і однозначно задано визначенням. Це не завжди зручно. Іноді в професійних програмах необхідно, щоб пам'ять для масиву виділялася в таких розмірах, які потрібні для рішення конкеретної задачі, причому потреби в пам'яті заздалегідь не відомі і не можуть бути фіксовані.

Формування масивів з змінними розмірами можна організувати за допомогою покажчиків і засобів для динамічного виділення пам'яті. Для цього використовують бібліотечні функції, описані в заголовочних файлах alloc.h і stdlib.h стандартної бібліотеки(таблиця 1.1).

Таблиця 1.1 – Бібліотечні функції стандартної бібліотеки

Функція

Прототип і короткий опис

malloc()

void*malloc(unsigned s);

Повертає покажчик на початок області (блоку) динамічної пам'яті довжиною в s байт. При невдалому завершенні повертає значення NULL

calloc()

void*calloc(unsigned n,unsigned m);

Повертає покажчик на початок області (блока) пам'яті обнуленої динамічної пам'яті, виділеної для розміщення n елементів по m байт кожний. При невдалому завершенні повертає значення NULL

realloc()

void*realloc(void*bl,unsigned ns);

Змінює розмір блоку раніше виділеної динамічної пам'яті до розміру ns байт. bl – адреса початку змінюваного блоку. Якщо bl дорівнює NULL (пам'ять не виділялася), то функція виконується як malloc()

free()

void*free(void*bl);

Звільняє раніше виділену ділянка динамічної пам'яті, адреса першого байта якого дорівнює bl

new()

void*new()

Створює масив( під час виконання програми також). Повертає адрес першого елемента виділеного блока.

delete()

void*delete()

Звільняє пам’ять, відведену для масиву.

Існує кілька способів резервування пам'яті в купі для динамічних змінних. Найпоширеніший спосіб використовує бібліотечну функцію malloc( )memory allocation чи memory allocator (виділення пам'яті чи розподільник пам'яті)

Наприклад:

Sp=malloc(129); /*резервування 128 байт

Sp=(char*)malloc(129); /*ті ж дії, тільки виконане приведення типів, тому що функція повертає тип void*/.

В обох цих випадках покажчик sp адресує блок купи з 129 байт, зарезервованих винятково для його особистого виконання.

Якщо купа вже заповнена, то функція malloc() повертає нуль, тому необхідно перевіряти після виклику функції, чи нерівний нулю покажчик:

sp=malloc(129);

if(sp==NULL)

error();

чи if((sp=malloc(129)!=NULL)оператор;

чи v=malloc(sizeof(double));

long*1;

p=calloc(1,sizeof(long));

У функціях malloc(),calloc(),realloc() динамічно виділяють пам'ять у відповідності зі значеннями параметрів і повертають адресу початку виділеної ділянки пам'яті. Для універсальності тип значення, що повертається, кожної з цих функцій є void*. Покажчик такого типу можна перетворити до покажчика будь-якого типу за допомогою операції явного приведення типу.

У функції free() аргументом являється вказівник на блок пам’яті, яка вже виділена функцією malloc(). Після виконання free() ця частина пам’яті може бути виділена знову, але її зміст втрачається . У випадку виходу за межі блока, виділеного функцією malloc(), також при виклику функції free() з аргументом, яки не є результатом malloc(), ефект буде непередбаченим.

Приклад використання :

malloc(),calloc(),realloc(),free():

Приклад 1

d_array=malloc((number_of_elements)*sizeof(float));

if(!d_array)

{

/* обробка помилки виділення пам’яті*/

}

/*…робота з елементами масиву …*/

free(d_array);

d_array=NULL;

Приклад 2

dynamic_array=calloc(number_of_elements,sizeof(float)

if(!dynamic_array)

{

/* обробка помилки виділення пам’яті */

}

/* … робота з елементами масиву … */

free(dynamic_array);

dynamic_array = NULL;

Приклад 3

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

main()

{

char *ptr;

ptr = realloc(NULL, 20*sizeof(char));

strcpy(ptr, "Це перша частина, ");

ptr = realloc(ptr, 100*sizeof(char));

strcat(ptr, "Це друга частина);

printf("%s\n", ptr);

realloc(ptr, 0);

}

Приклад 4

pointer = malloc(sizeof(data) * 1000);

/* … перевірка успішності виділення пам’яті, використання блока пам’яті … */

free(pointer);

pointer = NULL;

Приклад використання функцій:

new() і delete():

Наприклад, наступна програма USE_NEW.CPP використовує оператор new для одержання вказівника на 100-байтний масив:

#include <iostream.h>

void main(void)

{

сhar *pointer = newchar[100];    if (pointer != NULL) cout << "Пам’ять успішно виділена" <<endl;    else cout << "Помилка виділення пам’яти" << endl; }