Documente Academic
Documente Profesional
Documente Cultură
Fiindcă funcţia malloc() returnează un pointer fără tip (void *), este
necesară conversia la tipul necesar, adăugând (tip *) înainte de funcţia
malloc(), ceea ce se observă în schema propusă.
În următorul exemplu, se alocă memorie pentru a putea plasa 20 de elemente
de tip int.
int *fi;
fi=(int*)malloc(20*sizeof(int));
if(fi!=NULL)
printf(”Alocare ce succes!\n”);
else
printf(”Insucces la alocare!\n”);
Pentru a aloca memorie pentru un anumit număr de elemente de anumită
mărime este urilizată funcţia calloc()
void *calloc(size_t numar_el, size_t dim_el);
unde parametrii numar_el reprezintă numărul de elemente, iar dim_el
reprezintă dimensiunea fiecărui element din care constă fragmentul de memorie
alocată. Funcţia returnează adresa locaţiei de memorie, dacă are loc o alocare fără
erori sau valoarea nulă în caz de eroare. Schema generală de alocare a unui
fragment de memorie pentru N elemente de anumit tip este asemănătoare cu
schema din cazul precedent:
tip *adr_fr;
.
.
.
adr_fr=(tip *)calloc(N, sizeof(tip));
if(adr_fr!=NULL)
{ //prelucrarea necesara
.
.
}
else
{ //prelucrare in caz de erori
.
.
}
Şi în cazul acestei funcţii are loc conversia valorii returnate la tipul necesar.
Exemplul din cazul precedent va fi rescris astfel:
int *fi;
fi=(int*)calloc(20, sizeof(int));
if(fi!=NULL)
printf(”Alocare cu succes!\n”);
else
printf(”Insucces la alocare!\n”);
O funcţie utilă în procesul dirijării memoriei alocate este funcţia realloc().
Ea permite redimensionarea unui fragment alocat, având următorul prototip:
void *realloc(void *fr_mem, size_t dim_noua);
unde fr_mem este adresa fragmentului de memorie alocat, iar dim_noua este
marimea la care trebuie redimensionat fragmentul, măsurată în octeţi. Fragmentul
poate fi atât mărit, cât şi micşorat. Dacă la mărire fragmentul este mişcat în alt loc
al memoriei, informaţia din fragmentul vechi va fi copiată în fragmentul nou. La o
execuţie cu succes, funcţia returnează adresa fragmentului redimensionat, care
poate fi şi alta decât adresa fragmentului iniţial. La apariţia unor erori, funcţia
returnează valoarea nulă. Dacă parametrul dim_noua are valoarea zero, atunci
memoria va fi eliberată şi va fi returnată valoarea nulă. În continuare, este
prezentată schema generală de realocare a unui fragment de memorie pentru N
elemente de careva tip.
tip *adr_fr, *adr_r;
.
.
.
adr_r=(tip *)realloc(adr_fr, N*sizeof(tip));
if(adr_r!=NULL)
{ //prelucrare la o realocare cu succes
.
.
}
else
{ //prelucrare in caz de erori la realocare
.
.
}
Au fost prezentate funcţiile care permit alocarea memoriei. Însă memoria alocată
în unele situaţii trebuie şi eliberată. Pentru a putea efectua operaţia de eliberare a
memoriei, este utilizată funcţia free(), având următorul prototip:
void free(void *adr_mem);
unde adr_mem este pointerul care conţine adresa memoriei eliberate. Funcţia dată
eliberează memoria de la adresa dată şi nu returnează nici o valoare.
Exemplu. Să se alcătuiască un program care permite citirea de la tastatură a
unui şir de caractere de lungime arbitrară, memorându-l într-un tablou dinamic.
char *CitireSir()
{
char *adrSir, *adrNoua, c;
int i=0, lungSir=16;
adrSir=(char*) calloc(lungSir, 1);
if (adrSir != NULL)
{
do
{
c=getche();
if(c == ’\r’) //\r – Enter
{
adrSir[i]=’\0’;
break;
}
adrSir[i] = c;
i++;
if(i>=lungSir)
{
adrNoua = realloc(adrSir, lungSir+16);
if (adrNoua == NULL)
{
adrSir[--i]=’\0’;
break;
}
else
{adrSir=adrNoua;}
lungSir+=16;
}
}
while (1);
}
adrSir = realloc(adrSir, i+1);
return adrSir;
}
//------------
void main()
{
char *sir;
sir = CitireSir();
printf(”%s\n”, sir);
getch();
free(sir);
}