Cand calloc este utilizat pentru a aloca un bloc de memorie, regiunea alocată este inițializată la zero. In contrast, malloc nu atinge conținutul blocului de memorie alocat, ceea ce înseamnă că conține valori de gunoi. Acest lucru ar putea fi un risc de securitate deoarece conținutul memoriei este imprevizibil și erorile de programare pot duce la o scurgere a acestor conținuturi.
calloc | malloc | |
---|---|---|
Funcţie | alocă o regiune de memorie suficient de mare pentru a deține "n elemente" de bytes "size" fiecare. De asemenea, inițializează conținutul memoriei la zero. | aloca "byte" de memorie. |
Numărul de argumente | 2 | 1 |
Sintaxă | void * calloc (număr de blocuri, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Conținutul memoriei alocate | Regiunea alocată este inițializată la zero. | Conținutul memoriei alocate nu este modificat. adică, memoria conține valori imprevizibile sau de gunoi. Aceasta prezintă un risc. |
Valoare returnată | vid pointer (void *). Dacă alocarea este reușită, un indicator al blocului de memorie este returnat. Dacă alocarea memoriei eșuează, este returnat un indicator NULL. | vid pointer (void *). Dacă alocarea este reușită, un indicator al blocului de memorie este returnat. Dacă alocarea memoriei eșuează, este returnat un indicator NULL. |
void * malloc (dimensiune size_t);
alocari mărimea
octeți de memorie. Dacă alocarea este reușită, un indicator al memoriei alocate este returnat. In caz contrar NUL
este returnat. Exemplu:
/ * Alocarea memoriei pentru o matrice cu 15 elemente de tip int. * / int * ptr = malloc (15 * dimensiunea (int)); dacă (ptr == NULL) / * memoria nu a putut fi alocată, printați o eroare și ieșiți. * / fprintf (stderr, "Nu s-a putut aloca memorie \ n"); ieșire (EXIT_FAILURE); / * Alocarea a reușit. * /
Rețineți că malloc
cere ca noi să calculăm octeții de memorie de care avem nevoie și să trecem asta ca argument pentru malloc.
void * calloc (size_t nelements, size_t bytes);
aloca un bloc de memorie contiguos suficient de mare pentru a ține nelements
de dimensiune bytes
fiecare. Regiunea alocată este inițializată la zero. În exemplul de mai sus:
/ * Alocarea spațiului pentru o matrice cu 15 elemente de tip int și inițializa la zero. * / int * ptr = calloc (15, sizeof (int)); dacă (ptr == NULL) / * memoria nu a putut fi alocată, printați o eroare și ieșiți. * / fprintf (stderr, "Nu s-a putut aloca memorie \ n"); ieșire (EXIT_FAILURE); / * Alocarea a reușit. * /
calloc (m, n) este același ca
p = malloc (m * n); dacă (p) memset (p, 0, m * n);
Acest tutorial video explică funcțiile de alocare a memoriei malloc
, calloc
și realloc
, precum și funcția de de-alocare a memoriei liber
:
Este, în general, o idee bună de a utiliza calloc
peste malloc
. Când utilizați malloc, conținutul memoriei alocate este imprevizibil. Erori de programare pot determina scurgerea acestor conținuturi în moduri neintenționate, dar foarte vulnerabile. Un bun exemplu al unei astfel de scurgeri este vulnerabilitatea Heartbleed în OpenSSL, mecanismul de bază al căruia este explicat în acest comic XKCD și câteva detalii tehnice sunt în acest post pe blog.
calloc este un mic pic mai lent decât malloc din cauza pasului suplimentar de inițializare a regiunii de memorie alocate. Cu toate acestea, în practică diferența de viteză este foarte mică și poate fi ignorată.