Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
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,
� realloc – mijenja veličinu alocirane memorije, � free - oslobađa alocirani prostor.
� Sintaksa:void * malloc( size_t size );void * calloc( size_t num, size_t size );
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++)
mat[i] = (int *) malloc( brojstupaca * sizeof(int));
Programiranje 2 15
matmat [0]
mat [1]
mat [2]
...
mat [n]
n = brojredaka-1
k = brojstupaca-1
matmat [0]
mat [1]
mat [2]
...
mat [n]
[0] [1] ... [k]
[0] [1] ... [k]
[0] [1] ... [k]
[0] [1] ... [k]
[0] [1] ... [k]
Dinamička alokacija matrica� Matrica je formirana i mogu se raditi operacije s matricom, npr:
for(i = 0; i < brojredaka; i++)for(j = 0; j < brojstupaca; j++)
mat[i][j] = 0;
� 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.
� Sintaksa naredbe za alokaciju strukture:struct tocka *p = (struct tocka *) malloc (sizeof(struct tocka))
� Sintaksa naredbe za alokaciju niza od n struktura:struct tocka *p = (struct tocka *) malloc (n * sizeof(struct tocka))
Programiranje 2 20
Programiranje 2 21
Samoreferentne strukture� Što sve (koji tipovi varijabli) može biti element strukture?
� Članovi strukture mogu biti bilo kojeg prethodno definiranog tipa.
� Struktura NE MOŽE sadržavati "samu sebe", jer se ona tek definira.� Struktura MOŽE sadržavati pokazivač na "sebe".
� Takve strukture se nazivaju samoreferentne ili rekurzivne strukture.
� Primjer:
struct cvor {int elem;struct cvor * next;
} ;
Programiranje 2 (450/III)
Dinamička alokacija 10
Programiranje 2 22
Samoreferentne strukture//1struct cvor * dummy;struct cvor s1, s2,s3;//2s1.elem = 1;s2.elem = 2;s3.elem = 3;//3dummy = &s1;//4s1.next = &s2;s2.next = &s3;s3.next = NULL;
?1000
?1100
?1200
?1300
dummy
s1
s2
s3
?1000
1
?1100
2
?1200
3
?1300
dummy
s1
s2
s3
11001000
1
?1100
2
?1200
3
?1300
dummy
s1
s2
s3
11001000
1
12001100
2
13001200
3
NULL1300
dummy
s1
s2
s3
Programiranje 2 23
Samoreferentne strukture//1struct cvor dummy;struct cvor s1, s2,s3;//2s1.elem = 1;s2.elem = 2;s3.elem = 3;//3dummy.next = &s1;//4s1.next = &s2;s2.next = &s3;s3.next = NULL;
Programiranje 2 (450/III)
Dinamička alokacija 11
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:
Bodovi Ocjena
50 - 60% => 2
61 – 74% => 3
75 – 87% => 4
88 -100% => 5
Programiranje 2 (450/III)
Dinamička alokacija 12
Dinamičko alociranje memorije
KRAJ!!!