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.
príkaz sed
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. ako získať emotikony iphone na android | 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 |