Rozdíl mezi malloc() a calloc() s příklady
Funkce malloc() a calloc() jsou knihovní funkce, které dynamicky alokují paměť. Dynamický znamená, že paměť je alokována během běhu (provádění programu) ze segmentu haldy.
Inicializace
malloc() alokuje paměťový blok dané velikosti (v bajtech) a vrátí ukazatel na začátek bloku. malloc() neinicializuje přidělenou paměť. Pokud se pokusíte číst z přidělené paměti, aniž byste ji nejprve inicializovali, vyvoláte nedefinované chování , což obvykle znamená, že načtené hodnoty budou nesmyslné hodnoty.
calloc() alokuje paměť a také inicializuje každý bajt v přidělené paměti na 0. Pokud se pokusíte přečíst hodnotu přidělené paměti bez její inicializace, dostanete 0, protože již byla inicializována na 0 pomocí calloc().
Parametry
malloc() bere jediný argument, kterým je počet bajtů k přidělení.
Na rozdíl od malloc() má calloc() dva argumenty:
- Počet bloků, které mají být přiděleny.
- Velikost každého bloku v bajtech.
Návratová hodnota
Po úspěšné alokaci v malloc() a calloc() je vrácen ukazatel na blok paměti, jinak je vrácena hodnota NULL, což znamená selhání.
Příklad
Níže uvedený kód C ukazuje rozdíl mezi funkcemi malloc a calloc pro alokaci dynamické paměti.
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ýstup
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)
Rozdíl mezi malloc() a calloc() v C
Podívejme se na rozdíly v tabulkové podobě:
| Ano ne. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() je funkce, která vytváří jeden blok paměti pevné velikosti. | calloc() je funkce, která přiřazuje zadaný počet bloků paměti jedné proměnné. |
| 2. | malloc() bere pouze jeden argument | calloc() má dva argumenty. |
| 3. | malloc() je rychlejší než calloc. | calloc() je pomalejší než malloc() |
| 4. | malloc() má vysokou časovou efektivitu | calloc() má nízkou časovou efektivitu |
| 5. | malloc() se používá k označení alokace paměti | calloc() se používá k označení souvislé alokace paměti |
| 6. | Syntaxe : void* malloc(velikost_t velikost); | Syntaxe : void* calloc(velikost_t num, velikost_t velikost); |
| 8. | malloc() neinicializuje paměť na nulu | calloc() inicializuje paměť na nulu |
| 9. | malloc() nepřidává žádnou režii paměti navíc | calloc() přidává určitou režii paměti navíc |