Funkcije malloc() in calloc() so knjižnične funkcije, ki dinamično dodeljujejo pomnilnik. Dinamično pomeni, da je pomnilnik dodeljen med izvajanjem (izvajanjem programa) iz segmenta kopice.
Inicializacija
malloc() dodeli pomnilniški blok dane velikosti (v bajtih) in vrne kazalec na začetek bloka. malloc() ne inicializira dodeljenega pomnilnika. Če poskušate brati iz dodeljenega pomnilnika, ne da bi ga prej inicializirali, boste priklicali nedefinirano vedenje, kar običajno pomeni, da bodo vrednosti, ki jih preberete, smeti.
filtriranje python
calloc() dodeli pomnilnik in tudi inicializira vsak bajt v dodeljenem pomnilniku na 0. Če poskušate prebrati vrednost dodeljenega pomnilnika, ne da bi ga inicializirali, boste dobili 0, saj je bil že inicializiran na 0 s calloc().
Parametri
malloc() sprejme en sam argument, ki je število bajtov za dodelitev.
Za razliko od malloc(), calloc() sprejme dva argumenta:
- Število blokov, ki jih je treba dodeliti.
- Velikost vsakega bloka v bajtih.
Povratna vrednost
Po uspešni dodelitvi v malloc() in calloc() se vrne kazalec na blok pomnilnika, sicer se vrne NULL, kar pomeni napako.
Primer
Spodnja koda C prikazuje razliko med funkcijama malloc in calloc za dodeljevanje dinamičnega pomnilnika.
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);> }> |
>
>Izhod
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Razlika med malloc() in calloc() v C
Oglejmo si razlike v obliki tabele:
| da ne | malloc() | calloc() |
|---|---|---|
| 1. | malloc() je funkcija, ki ustvari en blok pomnilnika fiksne velikosti. | calloc() je funkcija, ki eni spremenljivki dodeli določeno število blokov pomnilnika. |
| 2. | malloc() sprejme samo en argument | calloc() sprejme dva argumenta. |
| 3. | malloc() je hitrejši od calloc. | calloc() je počasnejši od malloc() |
| 4. | malloc() ima visoko časovno učinkovitost | calloc() ima nizko časovno učinkovitost |
| 5. | malloc() se uporablja za označevanje dodelitve pomnilnika | calloc() se uporablja za označevanje sosednje dodelitve pomnilnika |
| 6. pretvorba tipov in pretvorba tipov v Javi | Sintaksa: void* malloc(size_t size); | Sintaksa: void* calloc(size_t num, size_t size); |
| 8. | malloc() ne inicializira pomnilnika na nič | calloc() inicializira pomnilnik na nič |
| 9. | malloc() ne doda dodatnega pomnilnika | calloc() doda nekaj dodatnega pomnilnika |