12
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

12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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

Page 2: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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.

Page 3: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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!!!!!!!!!!!!!

Page 4: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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

Page 5: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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?

Page 6: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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.

Page 7: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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

Page 8: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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

Page 9: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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;

} ;

Page 10: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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;

Page 11: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

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

Page 12: 12 din alokacija - Računarstvo 550. semestar... · 2016-03-11 · Programiranje 2 (450/III) Dinamička alokacija 2 Programiranje 2 3 Dinamička alokacija memorije Kada operativni

Programiranje 2 (450/III)

Dinamička alokacija 12

Dinamičko alociranje memorije

KRAJ!!!