Sunteți pe pagina 1din 6

LABORATOR 4

Alocarea dinamic a memoriei

n acest laborator sunt prezentate consideraii teoretice, probleme rezolvate si propuse privind alocarea dinamic a memoriei i utilizarea funciilor predefinite n C : malloc(), calloc(), realloc, free(), etc . i a noilor funcii new i delete introduse n C++. CONSIDERAII TEORETICE Cele mai importante funcii pentru alocarea dinamic a memoriei sunt : a) n C : malloc(), realloc(), calloc(), free(), etc. b) n C++: n plus fata de cele din C, se utilizeaz operatorii new i delete. Funcia malloc() are urmtorul prototip: void *malloc(unsigned n); unde: n = numrul de octei de memorie ce va fi alocat dinamic La apelare, funcia malloc() returneaz un pointer spre primul octet al regiunii de memorie alocate n memoria (heap) liber. Funcia aloc n memoria heap o zon contigu de n octei = numrul de octei specificat n paranteza funciei malloc(). Dac nu este suficient memorie disponibil atunci malloc() returneaz null. Bibliotecile ce trebuie incluse n program pentru utilizarea acestei funcii sunt: <stdlib.h> i <malloc.h> Alocarea unei zone de memorie contigue, neinitializate se realizeaz diferit n C sau C++ dup cum este ilustrat n cele ce urmeaz. a) secvena n C tip *p; p=malloc(n*sizeof(tip); b) secvena n C++ tip *p; p=(tip*)malloc(n*sizeof(tip);

n C nu este necesar specificarea tipului pentru a atribui lui p valoarea returnata de malloc(), deoarece un pointer de tip *void este automat convertit n tipul pointerului din partea stinga a atribuirii. n C++ este obligatorie specificarea explicita de tip atunci cind se atribuie un pointer de tip *void altui tip de pointer. O alt observatie important legata de utilizarea funciei malloc() este c zona de memorie alocata nu este initializat. Pentru evitarea erorilor trebuie inclus n program un test din care s rezulte dac exist memorie disponibil sau nu (null). Testarea valorii returnate de funcia malloc(), deci a existenei unei zone de memorie libere se poate realiza ca i n exemplu urmtor: Ex.: alocarea dinamica a unei zone de memorie pentru 100 de numere intregi =100*4 octeti=400 octeti. Se testeaza daca exist memorie liber, iar dac nu exist se afieaz mesajul de eroare memorie
-1-

insuficienta: int *ip = malloc(100 * sizeof(int)); if(ip == NULL) {printf("memorie insuficienta\n"); exit(1) } O alt funcie important este funcia free() reprezentnd funcia opus funciei malloc() care are ca efect eliberarea memoriei alocate dinamic anterior cu funcia malloc(). Funcia free() are urmtorul prototip: void *free(void *p); unde: p este un pointer spre memoria alocat anterior cu funcia malloc(). Bibliotecile ce trebuie incluse n program pentru utilizarea funciei free() sunt: <stdlib.h> si <malloc.h>. Un exemplu de utilizare a funciei free() : Ex.: Alocarea si dezalocarea unei zone de memorie pentru 50 de numere ntregi: int *p; p= (int *)malloc(50*sizeof(int)); free(*p); Functia realloc() are urmtorul prototip: void *realloc(void *p, unsigned n);

unde: p este un pointer spre memoria realocat dinamic Funcia realloc() realoc dinamic zona de memorie specificat prin numrul de octeti, n, spre care indic pointerul p . Bibliotecile ce trebuie incluse n program pentru utilizarea acestei funcii sunt: <stdlib.h> i <malloc.h> Ex: Iniial se aloc dinamic memorie pentru 50 de numere intregi . Ulterior se realoc dinamic o zona de memorie pentru 100 de numere ntregi , acelai pointer p coninnd adresa de nceput a zonei alocate dinamic: int *p; p= (int *)malloc(50*sizeof(int)); p= (int *)realloc(p, 100 * sizeof(int)); Dac realocarea nu este posibil din lipsa de memorie libera atunci realloc() returneaza NULL, altfel functia returneaz un pointer spre zona de memorie realocat. Funcia calloc() este functia de alocare si initializare cu 0 a memoriei i are urmtorul prototip: void *calloc(unsigned nrelem, unsigned dimelem); unde: nrelem=numrul de obiecte pentru care se rezerv memorie dimelem= numrul de octei de memorie ce va fi alocat pentru fiecare element Efectul apelrii acestei funcii este alocarea unei zone de memorie de dimensiune nrelem*dimelem, n memoria heap care se initializeaz cu 0, funcia returnnd un pointer la zona de memorie sau null dac
-2-

alocarea nu s-a putut realiza.

Bibliotecile ce trebuie incluse n program pentru utilizarea funciei calloc sunt: <stdlib.h> i <malloc.h>. Un exemplu de utilizare a acestei funcii este prezentat n continuare. Ex.: alocarea unei zone de memorie pentru 100 de numere ntregi iniializate cu 0 : int *p; p = (int *) calloc(100, sizeof(int)); Eliberarea zonei alocate dinamic cu funcia calloc() se poate face de asemenea utiliznd funcia free() . Alocarea dinamic a memoriei n C++ se realizeaz prin intermediul operatorilor Formatul de declarare al operatorului new este : new tip sau new (tip) sau new tip (expresie) sau new tip[exp] new i delete.

unde: tip = numele unui tip predefinit sau definit de utilizator expresie = expresie a crei valoare initializeaz zona de memorie alocat prin new exp = expresie de tip int folosit la alocarea dinamic a tablourilor. Operatorul new permite alocarea memoriei n zona heap i are ca i valoare adresa de nceput a zonei de memorie alocate sau 0 dac alocarea eueaz . Operatorul delete este utilizat pentru eliberarea zonei de memorie alocat cu operatorul new. Un exemplu de utilizare al operatorilor new si delete este prezentat mai jos. Ex.: tip *p; p=new tip; delete p; Un alt exemplu de utilizare al acestor operatori, cu alocarea/dealocarea memoriei pentru un tablou este prezentat mai jos: Ex.: tip *p=new tip[exp]; //alocarea unui tablou delete [exp]p; //eliberarea memoriei ocupate de tablou PROBLEME REZOLVATE

Ex.1.: S se scrie un program care aloc dinamic o zona de memorie pentru 100 de numere ntregi i afiseaza un mesaj de eroare n cazul n care nu exist suficient memorie liber.
//program ex1.c #include <stdio.h> #include <stdlib.h> //pentru functia exit() #include <malloc.h> //penrtu functia malloc() void main() {int *ip = malloc(100 * sizeof(int));if(ip == NULL) { printf("memorie insuficienta\n"); exit(1); } else printf("este memorie suficienta!!!"); }

Rezultate:

-3-

Aplicaie: s se completeze programul astfel nct s se iniializeze prin program sirul de numere cu valori de la 1 la 100 i s se afieze valorile n aceste puncte ale funciei:

x 1,x [ 1,50 ] f(x)= 2 x + 2,x [ 51,100 ]


Ex2.: S se scrie un program care realizeaz scderea a doua matrici ptratice de aceeai dimensiune n, unde n este un numr ntreg introdus de la tastatura, utiliznd alocarea dinamic a memoriei pentru cele dou matrici.
//program ex2.c #include<stdio.h> #include<conio.h> #include<malloc.h> void main(void) { int n,i,j, *p,*q; printf("Introduceti dimensiunea matricii patratice, n=");scanf("\n%d",&n); if((p=(int*)malloc(n*n*sizeof(int)))==NULL) { printf("eroare la alocarea memoriei pentru prima matrice\n"); } if((q=(int*)malloc(n*n*sizeof(int)))==NULL) { printf("eroare la alocarea memoriei pentru cea de-a 2-a matrice\n"); } //Citirea elementelor primei matrici printf("\nIntroduceti elementele matricii 1:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("a[%d][%d]=",i,j); scanf("%d",p+i*n+j); } //tiparirea elementelor primei matrici printf("Matrice 1:"); for(i=0;i<n;i++) { printf("\n"); for(j=0;j<n;j++) printf("%4d",*(p+i*n+j)); } printf("\nIntroduceti elementele matricii 2:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) { printf("b[%d][%d]=",i,j); scanf("%d",q+i*n+j); } printf("Matrice 2:"); for(i=0;i<n;i++) { printf("\n"); for(j=0;j<n;j++) printf("%4d ",*(q+i*n+j)); }printf("\n"); printf("rezultatul scaderii este:\n"); for(i=0;i<n;i++){ printf("\n"); for(j=0;j<n;j++) printf("%4d ",*(p+i*n+j)-*(q+i*n+j)); } printf("\n");free(p); free(q); }

Rezultate:

-4-

Ex.3: Sa se scrie programul care realizeaza alocarea dinamica a memoriei pentru un sir de n numere intregi, unde n este intreg citit de la tastatura si calculeaza suma si produsul elementelor sirului, precum si elementul minim si maxim din sir.
//program ex.3.c #include <stdio.h> #include <malloc.h> void main() {int *p, n,i,sum=0, prod=1, max, min; printf("Introduceti n intreg pozitiv: ");scanf("%d", &n); p=(int*)malloc(n*sizeof(int)); if(p==NULL) printf("\n eroare de alocare!"); printf("Introduceti %d nr. intregi:\n", n); for (i=0;i<n;i++) {printf("nr %d:",i+1); scanf("%d", p+i); } printf("ati introdus nr:"); max=min=*p; for (i=0;i<n;i++) { printf("%d ",*(p+i)); sum+=*(p+i);prod*=*(p+i); if (max<*(p+i)) max=*(p+i); if (min>*(p+i)) min=*(p+i);} printf("\nSuma elementelor =%d\n", sum); printf("Produsul elementelor=%d\n",prod); printf("maxim=%d\n", max); printf("minim=%d\n", min); printf("\n"); //eliberarea memoriei if(p) free (p); }

Rezultate:

-5-

Aplicatie: sa se modifice programul astfel inct dinamica a memoriei.


PROBLEME PROPUSE

sa se utilizeze functia calloc() pentru alocarea

1.

S se scrie un program care realizeaz citirea i afiarea unei matrici cu elemente ntregi, de dimensiune nxm, unde n,m sunt numere ntregi introduse de la tastatur, i realizeaz nmulirea sa cu o constant ntreag citit de la tastatur. Dup afiarea rezultatului se cere s se realoce dinamic memorie pentru un ir de n numere ntregi ce vor fi citite de la tastatura i apoi afiate la puterea a 3-a.

2. S se scrie un program n C/C++ care realizeaz nmultirea a dou matrici de numere ntregi, dimensiune mxn (m linii i n coloane) si nxl (n linii i l coloane) utiliznd alocarea dinamic a memoriei. 3. S se scrie un program n C++ care aloc memorie dinamic pentru un ir de 256 caractere, testnd dac exist memorie liber. Acest sir trebuie initializat cu litera 'A' si apoi afisat din 10 in 10 elemente. 4. S se scrie un program n C++ care aloc memorie dinamic pentru trei iruri de cte 256 de caractere i va elibera pe rnd memoria alocat dinamic dupa iniializarea celor trei iruri cu valori constante. 5. S se scrie programul care realizeaz alocarea dinamic a memoriei pentru un ir de n (citit de la tastatura) numere reale i calculeaz i afieaz termenii sirului i transpusa unei matrici utiliznd alocarea dinamic a memoriei. 6. S se scrie programul care realizeaz inversa i transpusa unei matrici utiliznd alocarea dinamic a memoriei. 7. Se consider o matrice A cu m linii i n coloane, cu elemente reale. S se scrie programul care calculeaz i afieaz expresia de mai jos utiliznd alocarea dinamic a memoriei:
E =
i = 1 j =1 m n 2 ai , j

a , unde i , j sunt elementele matricii.

8. Se consider matricile ptratice A i B cu n linii i coloane. Se cere s se scrie un program pentru determinarea matricii C=A-1-BT utiliznd alocarea dinamic a memoriei.

-6-