calloc vs. malloc

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.

Diagramă de comparație

calloc comparativ cu tabelul de comparație malloc
callocmalloc
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.

Conținut: calloc vs. malloc

  • 1 Sintaxă și exemple
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Video Explicând Calloc, Malloc și Realloc
  • 3 Considerații privind securitatea
  • 4 Viteza execuției
  • 5 Referințe

Sintaxă și exemple

malloc ()

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.

calloc ()

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); 

Explicarea video a lui Calloc, Malloc și Realloc

Acest tutorial video explică funcțiile de alocare a memoriei malloc, calloc și realloc, precum și funcția de de-alocare a memoriei liber:

Considerații privind securitatea

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.

Viteza execuției

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ă.

Referințe

  • calloc man page
  • malloc man page