Rozdiel medzi malloc() a calloc() s príkladmi
Funkcie malloc() a calloc() sú knižničné funkcie, ktoré dynamicky prideľujú pamäť. Dynamická znamená, že pamäť je alokovaná počas behu (spustenia programu) zo segmentu haldy.
Inicializácia
malloc() pridelí pamäťový blok danej veľkosti (v bajtoch) a vráti ukazovateľ na začiatok bloku. malloc() neinicializuje pridelenú pamäť. Ak sa pokúsite čítať z pridelenej pamäte bez toho, aby ste ju najprv inicializovali, potom vyvoláte nedefinované správanie , čo zvyčajne znamená, že hodnoty, ktoré čítate, budú hodnoty odpadkov.
calloc() pridelí pamäť a tiež inicializuje každý bajt v pridelenej pamäti na 0. Ak sa pokúsite prečítať hodnotu pridelenej pamäte bez jej inicializácie, dostanete 0, pretože už bola inicializovaná na 0 pomocou calloc().
Parametre
malloc() má jediný argument, ktorým je počet bajtov na pridelenie.
Na rozdiel od malloc() má calloc() dva argumenty:
- Počet blokov, ktoré sa majú prideliť.
- Veľkosť každého bloku v bajtoch.
Návratová hodnota
Po úspešnej alokácii v malloc() a calloc() sa vráti ukazovateľ na blok pamäte, inak sa vráti NULL, čo znamená zlyhanie.
Príklad
Nižšie uvedený kód C demonštruje rozdiel medzi funkciami malloc a calloc na pridelenie dynamickej pamäte.
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);> }> |
Výkon
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)
Rozdiel medzi malloc() a calloc() v C
Pozrime sa na rozdiely v tabuľkovej forme:
| Áno nie. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() je funkcia, ktorá vytvára jeden blok pamäte pevnej veľkosti. | calloc() je funkcia, ktorá priraďuje zadaný počet blokov pamäte jednej premennej. |
| 2. | malloc() má iba jeden argument | calloc() má dva argumenty. |
| 3. | malloc() je rýchlejší ako calloc. | calloc() je pomalší ako malloc() |
| 4. | malloc() má vysokú časovú efektivitu | calloc() má nízku časovú efektivitu |
| 5. | malloc() sa používa na označenie alokácie pamäte | calloc() sa používa na označenie súvislej alokácie pamäte |
| 6. | Syntax : void* malloc(veľkosť_t veľkosť); | Syntax : void* calloc(size_t num, size_t size); |
| 8. | malloc() neinicializuje pamäť na nulu | calloc() inicializuje pamäť na nulu |
| 9. | malloc() nepridáva žiadnu dodatočnú réžiu pamäte | calloc() pridáva réžiu pamäte navyše |