19
02/07/22 1 DINAMIČKO DODELJIVANJE MEMORIJE U programskom jeziku C moguće je izvršiti dinamičku dodelu memorijskog prostora, tako da se u toku izvršenja programa koristi samo potreban memorijski prostor. Statička dodela je neracionalna. Dinamičkim zauzimanjem memorijskog prostora, koje se obavlja tokom izvršenja programa, postiže se racionalno korišćenje memorije. U toku programa moguće je dodeljivanje i otkazivanje "rezervacije" memorijskog prostora.

Op 10 3132

Embed Size (px)

DESCRIPTION

Sam programski jezik je uređen konačan skup znakova za formulisanje programa. Njegova definicija data u ISO standardu glasi: programski jezik je veštački jezik koji se koristi za predstavljanje programa. Sam program predstavlja sistem oznaka za opis algoritama i struktura podataka pomoću kojih ljudi komuniciraju sa računarom. Jednostavnije korišćenje mašinskog jezika dobija se uvođenjem simboličkih imena za naredbe i adreseme morijskih lokacija, a to omogućava asemblerski ili simbolički mašinski jezik. Asemblerski jezik je niskog nivoa, zbog toga što je korespodencija između asemblerskog i mašinskog jezika jedan prema jedan. Programer koristi naredbe računara na kome radi, pa stoga program nije prenosiv - ne može se izvršiti na drugom računaru bez reprogramiranja.

Citation preview

Page 1: Op 10 3132

04/10/23 1

DINAMIČKO DODELJIVANJE

MEMORIJE • U programskom jeziku C moguće je izvršiti

dinamičku dodelu memorijskog prostora, tako da se u toku izvršenja programa koristi samo potreban memorijski prostor. Statička dodela je neracionalna. Dinamičkim zauzimanjem memorijskog prostora, koje se obavlja tokom izvršenja programa, postiže se racionalno korišćenje memorije. U toku programa moguće je dodeljivanje i otkazivanje "rezervacije" memorijskog prostora.

Page 2: Op 10 3132

04/10/23 2

DINAMIČKO DODELJIVANJE MEMORIJE

• Za razliku od statičke dodele memorije gde se podacima pristupa preko imena promenljivih, dinamički pristup podacima vrši se uglavnom preko pokazivača. Sama dodela memorije obavlja se uz pomoć bibliotečnih funkcija koje se nalaze u <stdlib.h> kao što su:

• malloc(n) - funkcija dodeljuje memoriju od n bajtova;

• calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova.

• free(p) - oslobađa prostor.

Page 3: Op 10 3132

04/10/23 3

malloc

• char *malloc( unssigned n)• gde n predstavlja broj bajtova koje izdvaja

funkcija.• Vreednost funkcije je znakovni pokazivač na

prvi bajt izdvojene oblasti. • Sledeći operatori funkcijom malloc izdvajaju

200 bajta • int *pint • pint = (int*) malloc(200)

Page 4: Op 10 3132

04/10/23 4

sizeof

• sizeof (izraz) - Vraća memorijski prostor neophodan za čuvanje izraza

• sizeof (T) - Vraća memorijski prostor neophodan za čuvanje vrednosti tipa T

Page 5: Op 10 3132

04/10/23 5

Statička dodela memorije

• Prilikom definicije niza od n članova u pokazivaču niz počinje sa adresom u memoriji prvog elementa niza.

• int *niz;• niz=calloc(n,sizeof(int));• Na ovaj način dodeljivanja memorijskog prostora

unapred je definisan broj članova niza n, tj veličina memorije na početku izvršenja program. Ovako se rezerviše n puta 2 (4) bajta jer je sizeof(int) 2 ili 4 u zavisnosti od računara.

Page 6: Op 10 3132

04/10/23 6

Dinamička dodela memorije

• Kada je potrebno rezervisati prostor za pokazivač p sa još nedefinisanim sadrzajem treba napisati sledeće: p=(int*)malloc(sizeof(int);

Page 7: Op 10 3132

04/10/23 7

Dinamička dodela memorije

• Rezervisanom prostoru se može pristupiti samo preko pokazivača p naredbom:

• *p=5;• na adresi 1253 dolazi vrednost 5.

Page 8: Op 10 3132

04/10/23 8

• Funkcija free oslobađa prostor u memoriji koji je prethodno rezervisan preko funkce malloc, a čija se adresa nalazila u pokazivaču p.

• free(p)• Vrednost koja se nalazi na toj adresi na

koju je upućivao pokazivač p ostaje , ali• joj se više ne može pristupiti

Page 9: Op 10 3132

04/10/23 9

• Vrednost koja se nalazi na toj adresi na koju je upućivao pokazivač p ostaje , ali

• joj se više ne može pristupiti

Page 10: Op 10 3132

04/10/23 10

NAJVECI ELEMENTNIZA PROIZVOLJNE DIMENZIJE

• #include <stdio.h>• /* Neophodno je ukljuciti stdlib.h */• #include <stdlib.h>• main()• {• int n;• /* Deklaracija int a[n]; • nije dozvoljena jer kompajler ne moze u vreme prevodjenja

da odredi potrebnu kolicinu memorije. Umesto ovoga, vrši se dinamička alokacijai memorije tj. rezervacija memorije u fazi izvrsavanja rograma kada bude poznata vrednost broja n. Zbog toga je potrebno upamtiti samo adresu pocetka alociranog bloka sto se postize koriscenjem sledeceg pokazivaca: */

Page 11: Op 10 3132

04/10/23 11

• Int *a;

• int i, max;

• printf("Unesi dimenziju niza : ");

• scanf("%d", &n);

• /* U ovom treunutku se zna koliko je memorije potrebno i poziva se funkcija

• malloc za dinamicku alokaciju. */

Page 12: Op 10 3132

04/10/23 12

• a = (int*) malloc(n*sizeof(int));• /* U slucaju da nema

dovoljno memorije malloc vraca NULL */• if (a == NULL)• {• printf("Greska : Nema dovoljno memorije!\n");• return 1;• }

Page 13: Op 10 3132

04/10/23 13

• /* Kao obican niz */• for (i = 0; i<n; i++)• {• printf("a[%d]=", i);• scanf("%d", &a[i]);• }• /* Nalazi maksimum */• max = a[0];• for (i = 1; i<n; i++)• if (a[i] > max)• max = a[i];• printf("Najveci element je %d\n", max);• scanf("%d");• /*Alocirana memorija se oslobadja */• free(a);• return 0;• }

Page 14: Op 10 3132

04/10/23 14

HEAP

STACK

STATIC DATA

CODE

DINAMIČKA ALOKACIJA MEMORIJE

System space

Program space

Run-time allocate memory

Compile-time allocate memory

Page 15: Op 10 3132

04/10/23 15

heap

memory manager

user code

“Potreban je memorijski blok veličine n”malloc(n) ili calloc(x,n)

DINAMIČKA ALOKACIJA MEMORIJE

Ovde je pokazivač bloka

“Nije više potreban memorijski blok”free(p)

Rezervacija i oslobadjanje

•malloc(n) - funkcija dodeljuje memoriju od n bajtova;•calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova.•free(p) - oslobađa prostor.

Page 16: Op 10 3132

04/10/23 16

*/#include <stdio.h> /* Neophodno je ukljuciti stdlib.h */

#include <stdlib.h>int main(){int n; int* a;int i, max;printf("Unesi dimenziju niza : ");scanf("%d", &n);

a = (int*) malloc(n*sizeof(int));/* U slucaju da nema dovoljno memorije malloc vraca NULL */

if (a == NULL) {printf("Greska : Nema dovoljno memorije!\n");return 1; }

/* Nadalje a koristimo kao obican niz */

for (i = 0; i<n; i++){printf("a[%d]=", i);scanf("%d", &a[i]); }

/* Nalazimo maksimum */

max = a[0];for (i = 1; i<n; i++)if (a[i] > max) max = a[i];printf("Najveci element je %d\n", max); /* Duzni smo da rucno alociranu memoriju rucno i oslobodimo */

free(a);return 0;}

PROGRAM UNOSI NIZ PROIZVOLJNE DIMENZIJE I NALAZI NAJVECI ELEMENT

Page 17: Op 10 3132

04/10/23 17

POKAZIVAČI NA MATRICE

U memoriji su smeštene u jednodimenzionalni niz tako što se prvo smešta prvi red matrice a zatim redom i ostali stoga pokazivač ukazuju na niz pokazivača koji ukazuju na niz(red) podataka.

Matrica je po definiciji dvodimenzionalni niz.

Matrica predstavlja nizjednodimenzionalnihnizova.

Page 18: Op 10 3132

04/10/23 18

int i, j, n; /*i, j indeksi matrice; n

veličina*/

double **a;

a = (double **) calloc(n, sizeof(double

*));

for (i = 0; i < n; ++i)

a[i] = (double *) calloc(n,

sizeof(double));

DINAMIČKA ALOKACIJA MATRICE

a[n-1]

0 1 2 3 ... n-1

.... ....

a[1] 0 1 2 3 ... n-1

a a[0] 0 1 2 3 ... n-1

Alociranje memorije za redove matrice(n elementa-double)

Alociranje memorije za n elemenata double pokazivača“

Page 19: Op 10 3132

04/10/23 19

FORMIRANJE I BRISANJE MARTICEI polu dinamičko II dinamičko

#include <stdio.h>#include <stdlib.h>main () {int *a[5]; /* Niz pokazivaca na int. */

int m, n, i, j;

/* Broj vrsta i kolona: */printf ("m,n? "); scanf ("%d%d", &m, &n);

/* Stvaranje matrice: */for (i=0; i<m; i++) {a[i] = malloc (n*sizeof(int));for (j=0; j<n; j++) printf ("%4.4d a%d

", *(a[i]+j)=100*i+j,(a[i]+j));putchar ('\n');

/* Unistavanje matrice: */ for (i=0; i<m; i++) free(a[i]); }

#include <stdio.h>#include <stdlib.h>main () {int **a; /* Pokazivac na pokazivac na int.*/int m, n, i, j;

/* Broj vrsta i kolona: */ printf ("m,n? "); scanf ("%d%d", &m, &n); /* Stvaranje matrice: */ a = malloc (m*sizeof(int*)); for (i=0; i<m; i++) { *(a+i) = malloc (n*sizeof(int)); for (j=0; j<n; j++) printf ("%4.4d ", *(*(a+i)+j)=100*i+j); putchar ('\n'); }

/* Unistavanje matrice: */ for (i=0; i<m; i++) free(*(a+i)); free (a); }