ALOCAREA DINAMICĂ A MEMORIEI

 

      Biblioteca standard a limbajului C pune la dispoziţia utilizatorului funcţii care permit alocarea de zone de memorie în timpul execuţiei programului. O astfel de zonă de memorie poate fi utilizată pentru a păstra date temporare. Zona respectivă poate fi eliberată în momentul în care nu mai sunt necesare datele care au fost păstrate în ea. Alocarea de zone de memorie şi eliberarea lor în timpul execuţiei programelor permite gestionarea optimă a memoriei de către programator. Un astfel de mijloc de gestionare a memoriei îl vom numi alocare dinamică a memoriei.

      Vom indica două funcţii din bibloteca limbajului C utilizate frecvent în alocarea dinamică a memoriei. Prototipurile lor se află în fişierele standard alloc.h şi stdlib.h, deci pentru a le utiliza vom include unul din aceste fişiere.

      Funcţia malloc permite alocarea unui bloc de memorie a cărui dimensiune se specifică în octeţi. Funcţia returnează un pointer spre începutul zonei alocate. Întrucât acest pointer trebuie să permită memorarea oricărui tip de dată în zona alocată, el este de tip void *.

      Prototipul funcţiei este:

void *malloc (unsigned n);

unde n este numărul de octeţi al zonei de memorie care se alocă. În cazul în care n este prea mare, funcţia returnează pointerul NULL. 

      Funcţia free eliberează o zonă de memorie alocată prin malloc. Prototipul ei este:

void free (void *p); 

unde p este pointerul returnat de malloc la alocare, deci este pointerul spre începutul zonei care se eliberează.

Exemplu: 

Funcţia memchar memorează un şir de caractere într-o zonă de memorie alocată prin funcţia malloc. Ea returnează adresa de început a zonei în care s-a salvat şirul de caractere, deci returnează un pointer spre tipul char. 

#include <stdio.h>

#include <alloc.h>

#include <string.h>

char *memchar (char *s)

{           char *p;

            if ((p=(char *)malloc(strlen(s)+1) ) != NULL

            {            strcpy (p,s);

                        return p;

            } else

                        return NULL;

}

Observaţii:

1o. În fişierul stdio.h există definiţia constantei NULL.

2o. Fişierul alloc.h s-a inclus deoarece conţine prototipul funcţiei malloc.

3o. Fişierul string.h conţine prototipurile funcţiilor strlen şi strcpy.

4o. Funcţia malloc se apelează pentru a rezerva strlen(s)+1 octeţi; strlen returnează numărul de octeţi cuplaţi de caracterele proprii ale lui s (fără caracterul NULL). Cum în zona de memorie rezervată prin malloc se păstrează şi caracterul NULL, lungimea returnată de funcţia strlen s-a mărit cu 1.

5o. Pointerul returnat de malloc a fost convertit spre char *, deoarece el este de tip void *. Acest pointer se atribuie lui p, deci p pointează spre începutul zonei de memorie alocate prin apelul funcţiei malloc. Se testează dacă acest pointer este diferit de NULL (deci dacă s-a putut aloca memoria de dimensiunea cerută). În caz afirmativ, se transferă şirul prin apelul funcţiei strcpy, returnându-se apoi valoarea pointerului p.