Funcțiile malloc() și calloc() sunt funcții de bibliotecă care alocă dinamic memoria. Dinamic înseamnă că memoria este alocată în timpul execuției (execuția programului) din segmentul heap.
Inițializare
malloc() alocă un bloc de memorie de dimensiunea dată (în octeți) și returnează un pointer la începutul blocului. malloc() nu inițializează memoria alocată. Dacă încercați să citiți din memoria alocată fără să o inițializați mai întâi, atunci veți invoca un comportament nedefinit, ceea ce înseamnă de obicei că valorile pe care le citiți vor fi valori de gunoi.
cati ani are Kylie Jenner
calloc() alocă memoria și, de asemenea, inițializează fiecare octet din memoria alocată la 0. Dacă încercați să citiți valoarea memoriei alocate fără a o inițializa, veți obține 0 deoarece a fost deja inițializat la 0 de calloc().
Parametrii
malloc() ia un singur argument, care este numărul de octeți de alocat.
Spre deosebire de malloc(), calloc() ia două argumente:
- Numărul de blocuri care urmează să fie alocate.
- Dimensiunea fiecărui bloc în octeți.
Valoare returnată
După alocarea cu succes în malloc() și calloc(), este returnat un pointer către blocul de memorie, altfel este returnat NULL, ceea ce indică eșecul.
Exemplu
Codul C de mai jos demonstrează diferența dintre funcțiile malloc și calloc pentru a aloca memorie dinamică.
C
// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> >// Both of these allocate the same number of bytes,> >// which is the amount of bytes that is required to> >// store 5 int values.> >// The memory allocated by calloc will be> >// zero-initialized, but the memory allocated with> >// malloc will be uninitialized so reading it would be> >// undefined behavior.> >int>* allocated_with_malloc =>malloc>(5 *>sizeof>(>int>));> >int>* allocated_with_calloc =>calloc>(5,>sizeof>(>int>));> >// As you can see, all of the values are initialized to> >// zero.> >printf>(>'Values of allocated_with_calloc: '>);> >for> (>size_t> i = 0; i <5; ++i) {> >printf>(>'%d '>, allocated_with_calloc[i]);> >}> >putchar>(>'
'>);> >// This malloc requests 1 terabyte of dynamic memory,> >// which is unavailable in this case, and so the> >// allocation fails and returns NULL.> >int>* failed_malloc =>malloc>(1000000000000);> >if> (failed_malloc == NULL) {> >printf>(>'The allocation failed, the value of '> >'failed_malloc is: %p'>,> >(>void>*)failed_malloc);> >}> >// Remember to always free dynamically allocated memory.> >free>(allocated_with_malloc);> >free>(allocated_with_calloc);> }> |
>
>Ieșire
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Diferența dintre malloc() și calloc() în C
Să vedem diferențele într-o formă tabelară:
| Da nu. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() este o funcție care creează un bloc de memorie de dimensiune fixă. | calloc() este o funcție care atribuie un număr specificat de blocuri de memorie unei singure variabile. |
| 2. string la int în java | malloc() ia doar un argument | calloc() ia două argumente. |
| 3. | malloc() este mai rapid decât calloc. | calloc() este mai lent decât malloc() |
| 4. | malloc() are o eficiență ridicată în timp | calloc() are o eficiență de timp scăzută |
| 5. | malloc() este folosit pentru a indica alocarea memoriei | calloc() este folosit pentru a indica alocarea de memorie contiguă |
| 6. | Sintaxă: void* malloc(size_t size); | Sintaxă: void* calloc(size_t num, size_t size); |
| 8. | malloc() nu inițializează memoria la zero | calloc() inițializează memoria la zero |
| 9. | malloc() nu adaugă nicio suprasarcină suplimentară de memorie | calloc() adaugă o suprasarcină suplimentară de memorie |