This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Programiranje 2 (450/III)
Dinamička alokacija 1
Programiranje 2
Dinamička alokacija memorije
Programiranje 2 2
Sadržaj� Dinamička alokacija memorije
� slobodna memorija i alociranje memorije� malloc(), calloc(), realloc() i free()� dinamička alokacija nizova brojeva i znakova� dinamička alokacija matrice � dinamička alokacija strukture
� Samoreferentne strukture� dinamička alokacija samoreferentnih struktura
Programiranje 2 (450/III)
Dinamička alokacija 2
Programiranje 2 3
Dinamička alokacija memorije� Kada operativni sustav pokrene program dodijeli mu dio radne
memorije koji se sastoji od tri dijela:� memorija izvršnog koda programa,� memorija za statičke podatke (globalne, statičke varijable i
konstante), � memorija nazvana stog (eng. stack) koja se koristi za privremeni
smještaj automatskih varijabli (lokalne varijable i argumenti funkcija).
� Ostatak memorije se naziva slobodna memorija ili "heap".� Nadzor nad korištenjem slobodne memorije ima operacijski sustav.
Korisnički program
(strojni kod)Statički podaci
Operacijski sustav
+ trenutno aktivni
programi
Radna memorija računala
Slobodna memorija
Heap
Stog
(automatske
varijable)
Programiranje 2 4
Dinamička alokacija memorije� U C-u je implementirana mogućnost indirektnog korištenja slobodne
memorije a naziva se: dinamičko alociranje memorije.
� Alociranje memorije - dio slobodne memorije dodjeljuje se korisničkom programu.
� Dinamičko – jer se alociranje memorije se vrši tijekom izvršenja programa.
� Postupak kojim se alocirana memorija vraća na raspolaganje operativnom sustavu naziva se oslobađanje ili dealociranje memorije.
Programiranje 2 (450/III)
Dinamička alokacija 3
Programiranje 2 5
F-je za din. alociranje memorije� F-je za dinamičko alociranje memorije deklarirane su u datoteci <stdlib.h>. � To su funkcije:
� malloc – alocira se određeni broj byte-ova slobodne memorije bez inicijalizacije alocirane memorije,
� calloc – alocira se mjesto za N elemenata niza određenog tipa podatka i sve se vrijednosti postavljaju početno na 0,
void free( void *memblock );� Ukoliko f-ja za alociranje memorije vrati NULL, memorija nije alocirana.
Programiranje 2 6
Primjer korištenja funkcije malloc� Što će napraviti linija koda? Čemu služi (int *)?
int *pI = (int *) malloc(10 * sizeof(int));
� Koju bi poruku trebao ispisati printf?pI = (int *)malloc(n*sizeof(int));if(pI == NULL){
printf("??????????\n");exit(1);
}� Da nema više slobodne memorije!!!!!!!!!!!!!
Programiranje 2 (450/III)
Dinamička alokacija 4
Dinamička alokacija memorije� Kako se vrši alociranje memorije?
� Alociramo memoriju za string "Ana" i upišemo ga u memoriju:char *str1 = malloc(4); ctrcpy(str1, "Ana");
� Zašto 4 znaka? Zašto nema sizeof(char)?
Programiranje 2 7
Dinamička alokacija memorije� Ako se nadalje izvrši alociranje memorije za string "Ivona":
char * str2 = malloc(6); strcpy(str2, "Ivona");
� Između dva alocirana bloka je manje područje slobodne memorije.� Memorijski alokator u alocirani sadržaj ispred svakog bloka upisuje i
informacije o tom bloku, primjerice veličinu samog bloka.
� Realnu situaciju je bolje prikazati na sljedeći način:
Programiranje 2 8
Programiranje 2 (450/III)
Dinamička alokacija 5
Dinamička alokacija memorije� Što će se dogoditi kada korisnik oslobodi memoriju na koju pokazuje
str1, naredbom:free(str1);
� Slobodna memorija fragmentirana - pri višestrukim pozivima malloc/free može doći do višestruke fragmentacije, čime se "gubi" jedan dio slobodne memorije.
� Ne može se računati da se uzastopnim pozivima funkcije malloc() dobiva kontinuirani memorijski blok.
Programiranje 2 9
Programiranje 2 10
Dinamička alokacija i slobodna memorija� Što rade programi?
Programiranje 2 (450/III)
Dinamička alokacija 6
Programiranje 2 11
Dinamička alokacija niza brojeva� Napisati program koji od korisnika traži da se prvo unese broj
elemenata niza, zatim se potrebna memorija dinamički alocira i unesu elementi niza brojeva.
Programiranje 2 14
Dinamička alokacija niza znakova� Napisati program koji unosi string, a zatim taj string ispisuje u
obrnutom redoslijedu. U programu se mogu deklarirati jedino pokazivači (dva pokazivača na znak), a za sve ostale varijable je prostor potrebno alocirati dinamički.
Programiranje 2 (450/III)
Dinamička alokacija 7
Dinamička alokacija matrica� Identifikator matrice se deklarira kao pokazivač na pokazivač na int:
int **mat;� Alocira se memorija za niz pokazivača na retke matrice (mat[i]):
mat = (int **) malloc ( brojredaka * sizeof(int *));
� Alocira memorija za svaki pojedini redak:for(k = 0; k < brojredaka; k++)
� Na kraju programa potrebno je osloboditi alociranu memoriju:for(k=0; k < brojredaka; k++)
free(mat[k]);free(mat);
Programiranje 2 16
Programiranje 2 (450/III)
Dinamička alokacija 8
Dinamička alokacija niza stringova� Napisati program koji sortira N
imena po abecedi. Najprije se u programu unosi N (svako ime može imati najviše 10 znakova), a zatim se unose i imena.
Programiranje 2 18
Dinamička alokacija višedim. nizova� Zbog čega kod matrica i kod nizova stringova se treba prvo alocirati
prostor za niz pokazivača, pa tek onda prostor za varijable?
� Zašto se ne može prostor za matricu 10x10 alocirati kao:int * mat = (int *)malloc(10*10*sizeof(int));
� Zašto se ne može prostor za 5 stringova od kojih svaki ima 10 znakova alocirati kao:char * str = (char *)malloc(5*10*sizeof(char));
Programiranje 2 19
Programiranje 2 (450/III)
Dinamička alokacija 9
Dinamička alokacija struktura� Napisati program koji od korisnika traži da se unese broj točaka
(svaka ima x i y koordinatu) zatim se dinamički alocira potreban prostor za sve te točke, unesu se koordinate točaka, te izračuna koja je najbliža, a koja najdalja od središta koordinatnog sustava.
Dinamička alokacija samoreferentnih struktura� Napisati program koji od korisnika traži da unese podatke o četiri
osobe (ime, prezime i godinu rođenja). U programu se ne smije unaprijed rezervirati mjesto za te strukture, nego dinamički alocirati i to na slijedeći način:a) Koriste se četiri pokazivača i svaki od njih pokazuje na jednu od
struktura, pojedinačne strukture je potrebno povezati u vezanu listu.
b) Koristi se samo jedan pokazivač i vezana lista se kreira kod alokacije.
Na kraju je potrebno ispisati podatke o svim osobama.
Programiranje 2 24
Programiranje 2 26
Zadaci za vježbe47. Napisati program koji unosi bodove kolokvija svih studenata i računa prosječni
broj bodova, nakon što su ocjene unesene, uz uvjet da unaprijed nije poznato koliko je bilo studenata.
48. Napisati program koji neki dekadski broj pretvara u string koji se sastoji od znamenki tog broja. String se dinamički alocira ovisno o tome koliko znamenki ima broj.
49. Napisati program koji čita imena N (unosi se u programu) studenata iz datoteke, a zatim za svakog studenta pita koliko je bodova dobio iz svakog od kolokvija (ukupno 3) i zatim računa ukupni broj bodova i ocjenu (i to su elementi strukture), prema tablici: