русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Короткі теоретичні відомості


Дата додавання: 2014-11-28; переглядів: 767.


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*/ }

 


<== попередня лекція | наступна лекція ==>
Приклад виконання лабораторної роботи | Варіанти індивідуальних завдань


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн