17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

int * a= (int*) calloc (n, sizeof(int) );<br />

Realocarea unui vector care creste (sau scade) fatã de dimensiunea estimatã<br />

anterior se poate face cu functia “realloc”, care primeste adresa veche si noua<br />

dimensiune si <strong>în</strong>toarce noua adresã:<br />

// dublare dimensiune curenta a zonei de la adr. a<br />

a = (int *)realloc (a, 2*n* sizeof(int));<br />

In exemplul anterior noua adresã este memoratã tot <strong>în</strong> variabila pointer “a”,<br />

<strong>în</strong>locuind vechea adresã (care nu mai este necesarã si nu mai trebuie folositã).<br />

Functia “realloc” realizeazã urmãtoarele operatii:<br />

- Alocã o zonã de dimensiunea specificatã ca al doilea argument.<br />

- Copiazã la noua adresã datele de la adresa veche (primul argument).<br />

- Elibereazã memoria de la adresa veche.<br />

Exemplu de functie cu efectul functiei “realloc”:<br />

char * ralloc (char * p, int size) { // p = adresa veche<br />

char *q; // q=adresa noua<br />

if (size==0) { // echivalent cu free<br />

free(p); return NULL;<br />

}<br />

q= (char*) malloc(size); // aloca memorie<br />

if (q) { // daca alocare reusita<br />

memcpy(q,p,size); // copiere date de la p la q<br />

free(p); // elibereaza adresa p<br />

}<br />

return q; // q poate fi NULL<br />

}<br />

In functia “ralloc” ar trebui ca ultimul argument al functiei “memcpy” sã fie<br />

dimensiunea blocului vechi, dar ea nu este disponibilã <strong>în</strong>tr-un mod care sã nu depindã<br />

de implementare; oricum, la mãrirea blocului continutul zonei alocate <strong>în</strong> plus nu este<br />

precizat, iar la micsorarea blocului se pierd datele din zona la care se renuntã.<br />

Functia “free” are ca argument o adresã (un pointer) si elibereazã zona de la adresa<br />

respectivã (alocatã prin apelul unei functii “...alloc”). Dimensiunea zonei nu mai<br />

trebuie specificatã deoarece este memoratã la <strong>în</strong>ceputul zonei alocate (de cãtre functia<br />

de alocare). Exemplu:<br />

free(a);<br />

Eliberarea memoriei prin "free" este inutilã la terminarea unui program, deoarece<br />

<strong>în</strong>ainte de <strong>în</strong>cãrcarea si lansarea <strong>în</strong> executie a unui nou program se elibereazã automat<br />

toatã memoria "heap".<br />

Uneori mãrimea blocurilor alocate este un multiplu de 8 octeti, dar detaliile<br />

gestiunii memoriei pentru alocare dinamicã depind de fiecare implementare. Existã

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!