logo

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.



sada c++

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:



  1. Počet bloků, které mají být přiděleny.
  2. 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);> }>

>

>

excel odstranit první znak
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

Související články