Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторн_робот_Ч2.doc
Скачиваний:
20
Добавлен:
03.11.2018
Размер:
2.12 Mб
Скачать

2. Теоретичні відомості

Масив, розмір якого визначається при виконанні ехе-коду, називається динамічним масивом, тому що використовує динамічну пам'ять.

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

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

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

Таблиця 11.2 – Основні бібліотечні функції

Функція

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

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

Наприклад,

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*.

Приклад: ввести і надрукувати в зворотному порядку набір чисел, кількість яких заздалегідь не фіксовано, а вводиться до початку введення самих числових значень.

#include<stdio.h>

#include<stdlib.h>