Sunteți pe pagina 1din 5

L12 Alocarea dinamic a memoriei (II)

Pentru a aloca spaiu n mod dinamic (n momentul rulrii programului) putem folosi una din funciile de mai jos, n funcie de necesiti

void *malloc(size_t size);


!uncia aloc n heap un "loc de dimensiune size octei# dac operaia reu$e$te returneaz un pointer la blocul alocat, altfel returnea% NULL &ste posi"il ca cererea de alocare s nu poat fi satisfcut dac nu mai e'ist suficient memorie n %ona de heap sau nu e'ist un "loc compact de dimensiune cel puin egal cu size (imensiunea size se specific n octei )e%ultatul funciei malloc fiind un pointer de tip void, se *a folosi operatorul cast pentru con*ersii de tip la atri"uire &'emplu (alocarea dinamic a unui ta"lou de ntregi)+
int *tab; tab=(int *)malloc( N*sizeof(int) );

void *calloc(size_t nitems, size_t size);


!uncia aloc n heap(o zon special de memorie) un "loc de dimensiune size*nitems octei, pe care i pune pe ,# dac operaia reu$e$te returnea% un pointer la blocul alocat, altfel returnea% NULL &ste posi"il ca cererea de alocare s nu poat fi satisfcut dac nu e'ist un "loc compact de dimensiune cel puin egal cu size*nitems (imensiunea size se specific n octei )e%ultatul funciei calloc fiind un pointer de tip void, se *a folosi operatorul cast pentru con*ersii de tip la atri"uire &'emplu (alocarea dinamic a unui ta"lou de ntregi)+
int *tab; tab=(int *)calloc( N, sizeof(int) );

void *realloc(void *block, size_t size);


!uncia ajustea% mrimea "locului de la adresa block la dimensiunea si%e# dac e ca%ul (de e' nu a*em suficient memorie la adresa "loc-), *a copia coninutul "locului la noua adres# dac operaia reu$e$te returneaz un pointer la blocul alocat, dac "locul nu poate fi reallocat sau size=0 returnea% NULL block pointea% ctre o %on de memorie o"inut anterior n mod dinamic size mrimea n octei a noului "loc alocat (ac block= NULL, realloc se comport ca un malloc &'emplu (alocarea dinamic a unui te't)+
#include <stdlib.h>

#include <stdio.h> char *citire_text(void); void main(void) { char *g_text; puts(""); i ( g_text!citire_text() ) "" daca s#a reusit citirea print ("$ntextul citit%$n&s"' g_text); ree(g_text); "" eliberea(a (ona de memorie; ve(i mai )os unctia ree * char *citire_text(void) { char *text!+,--; "" se creea(. un pointer care se initiali(ea(a cu +,-- (pointer vid)' pentru ca realloc sa se comporte ca si malloc la prima apelare char c; int n!/; 0hile ( (c!getchar()) 1! 234) { i ((text!(char*)realloc( text' (n56)*si(eo (char) ))!!+,--) return +,--; "" a aparut o eroare text7n8!c; 55n; * "" n56 ! n+1 elem(deoarece n porneste de la /) + 1 pentru9$/9 text7n8!9$/9; "" termintorul de sir return text; "" returnea(a adresa sirului de caractere citit *

void * ree(size_t size);


!uncia eli"erea% "loc de memorie (din .eap) o"inut anterior prin alocare dinamic &'emplu (dealocarea unui ta"lou alocat dinamic)+
int *tab; tab=(int *)calloc( N, sizeof(int) ); // prelucrare free(tab);

!roblem rezolvat
#include <stdlib.h> #include <stdio.h> /* problema care citeste si afiseaza o matrice alocata dinamic; matricea este alocata astfel incat sa poata fi accesata ca o matrice alocata static*/

int **alocare_matr(int **matr' int *an' int *am); int citire_matr(int **matr' int n' int m); void a isare_matr(int **matr' int n' int m); void main(void) { int **matr' m' n; matr!alocare_matr(matr' :n' :m); i (matr1!+,--) ""s#a putut aloca memorie citire_matr(matr' n' m); else { print ("eroare la alocare"); return; "" se termina programul * a isare_matr(matr' n' m); * int **alocare_matr(int **matr' int *an' int *am) { int i' ); print ("$nmatricea are + linii si ; coloane$n"); print ("+!"); scan ("&d"'an ); print (";!"); scan ("&d"'am ); "" se aloca memorie pentru pointerii unde se stochea(a inceputul adresa liniilor i ( (matr!(int **)calloc(*an'si(eo (int *) ) )!!+,-- ) return +,--; "" daca nu se aloca mem' unctia returnea(a +,-"" se aloca memorie pentru matricea e ectiva i ( ( matr7/8!(int *)calloc((*an)*(*am)'si(eo (int)))!!+,-- ) "" operatorul cast return +,--; "" daca nu se aloca mem' unctia returnea(a +,-or( i!<; i<*an; i55 ) matr7i8!matr7/85i*(*am); celr n linii din matrice return matr; * int citire_matr(int **matr' int n' int m) { int i' )' =!/; or( i!/; i<n; i55 ) or ()!/; )<m; )55) { print ("a7&d87&d8!"' i' )); =!=5scan ("&d"' (*(matr5i)5)) ); comportament identic "" =!=5scan ("&d"' matr7i87)8 ); * ""punem in tabl matr adresele

""sau'

return =;

void a isare_matr(int **matr' int n' int m) { int i' ); or( i!/; i<n; i55 ) { or ()!/; )<m; )55) print ("&d "' *(*(matr5i)5)) ); print ("$n"); * *

Pro"leme
1. (5p)Cititi un text alcatuit din cuvinte care au maxim 30 de caractere. Alocati memorie pentru text pe masura ce cititi cuvintele (Ca si problema din exemplu, dar citesc una cate una cuvinte, nu caractere). Nu uitati sa eliberati memoria cand nu mai este necesara. Structura programului va urmari pe cea a programului din exemplu. .(!p)Cititi si a"isati o matrice de Nx#. #atricea se va aloca dinamic. Se vor scrie "unctii separate de citire si scriere. $imensiunea matricii se va citi in "unctia de citire, impreuna cu citirea matricii. (pana aici % p)Se va scrie de asemenea si o "unctie care calculea&a determinatul matricii. (si inca p) 3. (10 p) Cititi un text de la tastatura si memorati'l dinamic. Apoi parcurgeti textul si puneti cuvintele intr'o structura dictionar. Aceasta structura va "i de "apt un tablou de pointer, cate un pointer pentru "iecare litera a al"abetului. (ointerul corescun&ator lui a va pointa catre o &ona de mem in care sunt memorate, separate prin spatii, toate cuvintelele din text care incep cu litera a.

"mportant## /ei care fac cu 0a"riela 1o"u *or *eni la la"orator cu un re%umat care s includ cel putin partile colorate n ro$u Pentru lucrare (cei care ac cu $abriela %obu)& Lucrarea se *a da pe .artie, cu calculatorul pornit, $i se *a putea folosi .elp2ul 3or fi 2 tipuri de su"iecte, su"iecte de nota 4 $i su"iecte de nota 1, 5e alege nainte de a se *edea su"iectele !iecare *a *eni cu grupa lui6 /ei care *or recupera la"oratorul cu alta grupa sau in saptamana urmatoare *or a*ea nota sca%uta cu 1p !entu subiecte de nota '& 3or fi posi"ile $i mici ntre"ri de genul+ ce face funcia malloc7 /are e diferena dintre malloc $i calloc7 /e este o *aria"il de tip pointer7 Pro"leme de genul+ Alocai dinamic un ta"lou de intregi 5crieti o funcie care intersc.im" 2 *aria"ile date ca parametru /itii un $ir de caractere de la tastatur ($irul se *a aloca dinamic) Implementati functia strdup

8n mare cam orice pro"lem re%ol*at la la"orator (L11 si L12), pro"a"il u$or modificat, sau dintre pro"lemele propuse, dar nu cele mai complicate !entru subiecte de nota (0 Pro"leme care implic alocarea de ta"louri de $iruri adic *om a*ea o *aria"il de tipul c.ar 99 :n e'emplu de pro"lema este pro"lema ; de mai sus

a*eti aici pre%entata alocarea dinamic puin diferit, poate e mai u$or de neles .ttp+<<=== cs utt ro<>ga"ia<?P<1,Liste1<1,Liste1 .tm

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