Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Лабораторна робота № 19

Читайте также:
  1. Word. Робота з великими документами
  2. Вешалка для игл лабораторная
  3. Глава 36. Лабораторная крыса
  4. Глава IV Робота Суду
  5. Дипломних проектах (роботах)
  6. Індивідуальна робота вчителя-вихователя у навчально-виховному процесі. Робота з важковиховуваними учнями.
  7. Індивідуально – консультативна робота студентів

 

Тема: Складання програм з використанням бібліотечних функцій для роботи з динамічною пам’яттю

Мета: Навчитись описувати та організовувати динамічні масиви, виділяти і звільняти динамічну пам’ять, заносити дані в динамічні масиви

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

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

 

2 Завдання практичної роботи

 

Описати масив розмірністю 3, елементами якого є структура, описана у варіанті. Сформувати динамічний масив і заповнити його елементами заданого масиву, вивести новий масив на екран. Звільнити виділену пам'ять за допомогою функції free().

3 Варіанти індивідуальних завдань

1. Структура "Абітурієнт":

- прізвище, ім'я, по батькові; рік народження; оцінки вступних іспитів (3); середній бал атестата.

2. Структура "Співробітник":

- прізвище, ім'я, по батькові; посада рік народження; заробітна плата.

3. Структура "Держава":

- назва; столиця; чисельність населення; займана площа.

4. Структура "Людина":

- прізвище, ім'я, по батькові; домашня адреса; номер телефону; вік.

5. Структура "Людина":

- прізвище, ім'я, по батькові; рік народження; ріст; вага.

6. Структура "Школяр":

- прізвище, ім'я, по батькові; клас; номер телефону; оцінки по предметах (математика, фізика, українська мова, література).

7. Структура "Студент":

- прізвище, ім'я, по батькові; домашня адреса; група; рейтинг.

8. Структура "Покупець":

- прізвище, ім'я, по батькові; домашня адреса; номер телефону; номер кредитної картки

9. Структура "Пацієнт":

- прізвище, ім'я, по батькові; домашня адреса; номер медичної карти; номер страхового поліса.

10. Структура "Інформація":

- носій; об’єм; назва; автор.

11. Структура "Відеокасета":

- назва фільму; режисер; тривалість; ціна.

12. Структура "Музичний диск":

- назва; автор; тривалість; ціна.

13. Структура "Спортивна команда":

- назва; місто; кількість гравців; кількість набраних очок.

14. Структура "Стадіон":

- назва; адреса; місткість; види спорту.

15. Структура "Автомобіль":

- марка; рік випуску; ціна; кольори.

16. Структура "Власник автомобіля":

- прізвище, ім'я, по батькові; номер автомобіля; телефон; номер техпаспорта.

4 Методичні вказівки

1. Перед написанням програми переглянути теоретичний матеріал і приклади програм, що ілюструють масиви структур. Визначити структуру, задану у варіанті. Описати і задати масив, елементами якого є структура визначеного типу.

2. Сформувати динамічний масив за допомогою бібліотечних функцій malloc() (calloc()), розмір якого рівний заданому масиву структурного типу.

3. Заповнити сформований динамічний масив елементами заданого масиву.

4. Елементи сформованого масиву вивести на екран.

5. Звільнити виділену пам'ять функцією free().

5 Приклад виконання лабораторної роботи

Описати масив розмірністю 3, елементами якого є структура

Структура "Стадіон": назва; рік будівлі; кількість площадок; види спорту.

Сформувати динамічний масив і заповнити його елементами заданого масиву, вивести новий масив на екран. Звільнити виділену пам'ять за допомогою функції free().

Текст програми:

#include <stdio.h>

#include <stdlib.h>

int k, m;

void main() {

struct stadion {

char nazva[20];

int rik;

int kp;

char vsporty[20];}

*ptr1, nst1[3]= {{ "UKRAINE",1970, 12, "FYTBOL"},

{ "ARENADON",1980, 10, "BOKS"},

{"DNIPRO",1990, 10, "FYTBOL"}};

/*Виділяється 3*sizeof (struct stadion) пам’яті */

ptr1= malloc(3*sizeof (struct stadion));

for (k=0; k<3; k=k+1)

{ptr1[k]=nst1[k];

printf("k=%s\t%d\t%d\t%s\n", ptr1[k].nazva, ptr1[k].rik, ptr1[k].kp,

ptr1[k]. vsporty); }

free (ptr1);

}

Результати роботи програми

k=UKRAINE 1970 12 FYTBOL

k=ARENADON 1980 10 BOKS

k=DNIPRO 1990 10 FYTBOL

6 Контрольні запитання

1. В чому різниця між функціями розподілу пам’яті. malloc() і calloc()?

2. З допомогою якої функції звільняється пам’ять?

3. Що таке динамічний розподіл пам’яті?

4. В чому різниця між структурою і масивом.?

5. Яким символом позначається операція звернення до елементу структури?

6. З допомогою якого ключового слова описується структура?


Дата добавления: 2015-07-17; просмотров: 169 | Нарушение авторских прав


Читайте в этой же книге: Лабораторна робота № 8 | Постановка завдання | Лабораторна робота № 9 | Лабораторна робота № 10 | Лабораторна робота № 11-12 | Лабораторна робота № 13-14 | Лабораторна робота № 15 | Int putchar(int c); | Лабораторна робота № 16 | Лабораторна робота № 17-18 |
<== предыдущая страница | следующая страница ==>
Struct data data1;| Результат

mybiblioteka.su - 2015-2024 год. (0.012 сек.)