Sunteți pe pagina 1din 6

PROGRAMARE 1 LUCRAREA NR.

10
1





POINTERI. ALOCAREA DINAMIC! A MEMORIEI

1. Pointeri
Un pointer este o variabil! care con"ine adresa altei variabile, a unei func"ii dac! este
ini"ializat cu aceast! adres!.
2. Alocarea dinamic" a memoriei
void *malloc(size_t n);
aloc! un bloc de memorie de n octe"i n memoria heap;
n caz de succes, returneaz! un adresa zonei de memorie alocate (c!reia nu-i
schimb! con"inutul)
returneaz! valoarea 0 (zero) dac! nu s-a putut face alocarea de memorie (pentru
c! nu exist! spa"iu liber cu m!rimea solicitat! sau dac! se apeleaz! cu n = 0).
Func"ia returneaz! un pointer generic (de tip void), a c!rui valoare poate fi asignat!
unui pointer de orice tip folosind o conversie explicit!.
ntotdeauna trebuie testat! valoarea returnat! (dac! este sau nu 0 (zero)) pentru c!
n cazul nealoc!rii memoriei programul nu trebuie s! continue.
Exemplu:
int *p = 0;
int n = 5;
p = (int *)malloc(n * sizeof(int));
if(p == 0)
{
fprintf(stderr, "Memorie insuficienta\n");
exit(EXIT_FAILURE);
}

Pentru c! aceast! testare trebuie s! o facem ori de cte ori aloc!m memorie pentru
un pointer se poate scrie o func"ie care s! con"in! aceast! testare. Prototipul acestei
func"ii (care nu se g!se#te n nici o bibliotec! a limbajului) este:

void *aloca1d(size_t nrOcteti);

(size_t este definitt n stdio.h ca sinonim pentru unsigned int)
PROGRAMARE 1 LUCRAREA NR. 10
2
Defini"ia acestei func"ii este:
void * aloca1d(size_t nrOcteti)
{
void *p;
p = malloc(nrOcteti);
if(p == 0)
{
fprintf(stderr, "Memorie insuficient!\n");
exit(EXIT_FAILURE);
}
return p;
}

n func"ia n care se face alocarea dinamic! (func"ia apelant!) secven"a de cod este:
int *a = 0;
int n = 4;
..................
a = (int *)aloca1d(n * sizeof(int); // aloca spa"iul necesar pentru a stoca
// n elemente de tip ntreg
...................

void *calloc(size_t nrElemente, size_t dimElement);
aloc! un bloc de memorie de m!rime nrElemente * dimElement (care nu trebuie
s! dep!#easc! 64 Ko octe"i din memoria heap), con"inutul blocului fiind resetat (se scrie
0);
n caz de succes, returneaz! adresa blocului de memorie alocat;
returneaz! 0 dac! nu exist! spa"iu liber de m!rimea solicitat! (sau dac! se
apeleaz! cu valorea 0).

void *realloc(void* block, size_t marime);
func"ia redimensioneaz! (prim m!rire sau mic#orare) un bloc de memorie (alocat
dinamic anterior) la num!rul de octe"i specifica"i de parametrul marime;
block trebuie s! indice un bloc de memorie ob"inut prin apelarea func"iilor malloc()
/ calloc() / realloc() (altfel rezultatul este imprevizibil);
dac! block este 0 (zero), lucreaz! exact ca malloc();
func"ia ajusteaz! m!rimea blocului alocat la marime, copiind (dac! este cazul)
con"inutul s!u la o nou! adres!;
returneaz! adresa blocului realocat (poate diferi de block) sau 0 (zero), dac! nu se
poate face realocarea sau marime = 0 (n acest ultim caz func"ia lucreaz! ca #i func"ia
free()).

PROGRAMARE 1 LUCRAREA NR. 10
3
void free(void *block);
elibereaz! un bloc de memorie alocat anterior de c!tre malloc() / calloc() /
realloc();
rezultatul este dezastruos dac! parametrul nu este rezultatul unei aloc!ri dinamice
anterioare sau dac! se apeleaz! de dou! ori la rnd cu acela#i parametru.
dup! folosirea func"iei free se recomand! invalidarea pointerului (pentru a nu mai
putea fi folosit accidental n continuare) prin atribuirea valorii 0 (zero) (vezi exemplul
urm!tor).
Exemplu:
int *a = 0;
int n = 3;
/*
* Alte definiri de date #i instruc"iuni
*/
...................................

a = (int *)aloca1d(n * sizeof(int)); // aloca spa"iul necesar pentru a stoca
// n elemente de tip ntreg

/*
* Prelucrari de date
*/
.........................................
/*
* Eliberarea memoriei
*/
free(a);
a = 0; // Obligatoriu pentru a invalida pointerul


TEMA 1
Problema nr. 1.1
S! se citeasc! de la tastatur! elementele unui vector cu n elemente numere ntregi $i
s! se afi$eze pe monitor. Vor trebui scrise dou! func%ii:
! func"ie pentru citirea unui vector de ntregi cu n elemente. Func"ia trebuie s! aib!
urm!torul prototip:
int *citireVectorP(size_t n);
! func"ie pentru afi#area elementelor unui vector de ntregi, cu prototipul:
void afisareVectorP(int *a, size_t n);

Problema nr. 1.2
S! se citeasc! de la tastatur! elementele unui vector cu n elemente numere ntregi
din fi$ierul doi.txt $i s! se afi$eze pe monitor. Vor trebui scrise dou! func%ii:
! func"ie pentru citirea unui vector de ntregi cu n elemente. Func"ia trebuie s! aib!
urm!torul prototip:
void citireVectorP(int *a, size_t n);
PROGRAMARE 1 LUCRAREA NR. 10
4
! func"ie pentru afi#area elementelor unui vector de ntregi, cu prototipul:
void afisareVectorP(int *a, size_t n);

Problema nr. 1.3
S! se citeasc! de la tastatur! elementele a dou! tablouri unidimensionale (vectori)
de n numere ntregi a #i b alocate dinamic. S! se calculeze vectorul sum! #i s! se afi#eze.
Rezolvarea problemei presupune construirea unui proiect (cu fi#ierul header
corespunz!tor) #i scrierea urm!toarelor func"ii:
! func"ie pentru: alocarea cu verificarea aloc!rii (func"ia aloca1d din curs);
! func"ie pentru citirea unui vector de ntregi cu n elemente. Func"ia trebuie s! aib!
urm!torul prototip:
int *citireVectorP(size_t n);
! func"ie pentru afi#area elementelor unui vector de ntregi, cu prototipul:
void afisareVectorP(int *a, size_t n);
! func"ie pentru calculul vectorului sum! a doi vectori, cu prototipul:
int *sumaVectori(int *x, int *y, size_t n);

Problema nr. 1.4
Se cite#te de la tastatur! un num!r natural n #i un vector de numere naturale v
pentru care se face alocare dinamic! de memorie.
Se formeaz! un nou vector w cu n elemente, de asemenea alocat dinamic, n care
valoarea fiec!rui element este suma cifrelor elementului corespunz!tor din vectorul v.
S! se afi#eze elementul din vectorul v care are cea mai mare sum! a cifrelor sale.
Se vor scrie urm!toarele func"ii:
! Func"ie pentru citirea unui vector de numere naturale care are ca parametru
num!rul de elemente #i returneaz! un pointer.
! Func"ie pentru afi#area vectorului de numere naturale sub forma
A = (23, 543, 912)
Func"ia are ca parametri vectorul de afi#at (exprimat ca un pointer) #i num!rul de
elemente.
! Func"ie pentru calculul sumei cifrelor unui num!r natural. Func"ia are ca
parametru un num!r natural (num!rul pentru care se calculeaz! suma cifrelor) #i
returneaz! un num!r natural (suma calculat!).
! Func"ie pentru determinarea elementelor vectorului w. Func"ia are ca parametri
un pointer #i un num!r natural #i returneaz! un pointer la un num!r natural. Aceast!
func"ie face apel, pentru calculul sumei cifrelor unui num!r natural, la func"ia definit!
la punctul anterior.
! Func"ie pentru determinarea maximului dintr-un #ir de numere. Func"ia
prime#te ca parametri un pointer la un num!r natural #i un ntreg #i returneaz!
indexul elementului cu valoarea maxim!.

TEMA 2
Problema nr. 2.1
Se cite#te de la tastatur! un num!r ntreg (poate fi pozitiv sau negativ). Citirea se
face cu scanf. Se determin! num!rul de cifre ale num!rului (prin logaritmare n baza 10).
PROGRAMARE 1 LUCRAREA NR. 10
5
Se face alocare dinamic! de memorie pentru un #ir de caractere capabil s!
memoreze cifrele num!rului #i eventualul semn. Num!rul citit se transform! n #ir de
caractere, f!r! a folosi func"ii de bibliotec!. Transformarea se face astfel nct fiecare cifr!
s! se plaseze direct pe locul ei.
Se afi#eaz! #irul de caractere rezultat.
Rezolvarea problemei presupune realizarea unui proiect care, pe lng! func"ia main,
s! cuprind! #i func"ii pentru:
! alocare dinamic! cu verificare (func"ia aloca1d din curs)
! transformarea num!rului n #ir de caractere. n acest caz func"ia are prototipul:
char *transformareToAscii(long int);

Problema nr. 2.2
S! se defineasc! tipul de dat! MULTIME ca o structur! care cuprinde:
" cardinalul mul"imii (num!rul de elemente din mul"ime) care este un num!r
ntreg f!r! semn;
" elementele mul"imii (de tip real), stocate prin intermediul unui pointer
S! se scrie un program care pentru dou! mul"imi
1. cite#te de la tastatur! cardinalul #i elementele mul"imii #i le stocheaz! ntr-o
structur! de tip MULTIME.
2. afi#eaz! cele dou! mul"imi sub forma
A = {3.14, 5.12, 3.00, 4.39}
B = {34.29, 15.14, 3.14}
(se presupune c! numele celor dou! mul"imi sunt A #i B, iar numerele reale se vor afi#a
cu dou! zecimale #i vor fi separate de o virgul! #i un spa"iu).

Observa#ie (referitoare la punctele 1 #i 2):
Se scriu func"ii pentru o singur! mul"ime. Func"iile se apeleaz! de mai multe ori.

3. afi#eaz! un meniu care d! posibilitatea utilizatorului s! aleag! una din
urm!toarele prelucr!ri:
a) determinarea mul"imii intersec"ie a celor dou! mul"imi (A&B) #i cardinalul acestei
mul"imi.
b) determinarea mul"imii diferen"! simetric! a celor dou! mul"imi (A-B) (mul"imea
diferen"! simetric! include elementele mul"imii A care nu sunt n mul"imea B #i elementele
mul"imii B care nu sunt n mul"imea A) #i cardinalul acestei mul"imi.
c) determinarea mul"imii reuniune a celor dou! mul"imi (A+B) #i cardinalul acestei
mul"imi.
4. Realizeaz! prelucrarea dorit! #i afi#eaz! mul"imea care rezult! n urma
prelucr!rii.
Programul poate face o singur! prelucrare n func"ie de op"iunea utilizatorului #i va
trebui scris astfel nct s! permit! prelucrarea mai multor seturi de date.
Observa!ii:
1) Se va citi cu aten"ie tabelul urm!tor care descrie n detaliu modul de rezolvare a
problemei #i descrierea prototipurilor func"iilor care trebuie scrise.
2) Dac! nu se folosesc func"iile indicate codul nu se puncteaz!.
3) Punctajul maxim se acord! pentru rezolvarea CORECT! a fiec!rei subprobleme.
PROGRAMARE 1 LUCRAREA NR. 10
6

1. Construirea structurii MULTIME (func"ia prime#te ca parametru numele
mul"imii #i returneaz! o structur! de tip MULTIME)
1,0
2. Alocarea corect! (cu verificare) de spa"iu de memorie pentru pointeri 0,5
3. Citirea valorilor elementelor mul"imii (ntr-o func"ie care prime#te ca parametru
un num!r natural #i returneaz! un pointer la real)
1,0
4. Afi#area valorilor vectorului din structur! conform modelului dat n problem!
(func"ia are un parametru o structur! de tip MULTIME #i nu returneaz! nimic)
1,0
5. Scrierea meniului de prelucrare (func"ia nu are nici un parametru #i returneaz!
un num!r care reprezint! num!rul op"iunii de prelucrare)
0,75
6. posibilitatea de reluare a programului (prelucrarea mai multor seturi de date) 0,5
7. Folosire proiect (corect) 0,5
8. Fi#ier header (corect #i complet) 0,5
9. Func"ia main (complet inclusiv eliberarea corect! a zonelor de memorie
folosite)
0,75
10. Func"ie care stabile#te dac! o valoare apar"ine unei mul"imi. Func"ia are 2
parametri: valoarea #i mul"imea (reprezentat! prin structur!) #i returneaz! 1/0
dup! cum valoarea se g!se#te sau nu n mul"ime.
0,5
11. Calculul mul"imii intersec"ie (func"ia prime#te ca parametri dou! structuri de
tip MULTIME #i returneaz! o structur! de tip MULTIME) inclusiv alocarea
corect! de memorie.
1,0
12. Calculul mul"imii diferen"! (func"ia prime#te ca parametri dou! structuri de tip
MULTIME #i returneaz! o structur! de tip MULTIME) inclusiv alocarea corect!
de memorie.
1,0
13. Calculul mul"imii reuniune (func"ia prime#te ca parametri doi pointeri la date
de tip MULTIME #i returneaz! o structur! de tip MULTIME) inclusiv alocarea
corect! de memorie.
1,0
TOTAL 10 p

S-ar putea să vă placă și