calloc() Funkce v knihovně C s programem EXAMPLE
⚡ Chytré shrnutí
Funkce calloc() v jazyce C rezervuje více souvislých bloků paměti na haldě a inicializuje každý bajt na nulu, čímž vrací ukazatel void, který umožňuje programům vytvářet čistá, připravená k použití pole a datové struktury za běhu.

Co je calloc v C?
Funkce calloc() v jazyce C slouží k alokaci více bloků paměti stejné velikosti. Jedná se o dynamickou alokační funkci, která alokuje paměťový prostor složitým datovým strukturám, jako jsou pole a struktury, a vrací do paměti prázdný ukazatel. Calloc je zkratka pro souvislou alokaci (contiguous allocation).
Funkce Malloc se používá k přidělení jednoho bloku paměťového prostoru, zatímco funkce calloc v C se používá k přidělení více bloků paměťového prostoru. Každý blok přidělený calloc v programování C má stejnou velikost.
Proč používat calloc() v jazyce C?
Běžné proměnné a pole s pevnou velikostí si při kompilaci programu uzamknou své rozměry, což plýtvá místem, když je potřeba méně prvků, a selže, když jich je potřeba více. Funkce calloc() toto omezení odstraňuje rezervací paměti za běhu a na rozdíl od malloc() vymaže každý bajt na nulu, než blok vrátí zpět. Díky tomu je calloc() přirozenou volbou, kdykoli program potřebuje čistou a předvídatelnou oblast paměti pro pole nebo strukturu, jejíž velikost je známa pouze během běhu kódu.
Dynamická alokace s calloc() se hodí k několika běžným situacím:
- Číselná pole, která by měla začínat od nuly, jako například čítače, histogramy nebo spuštěné akumulátory.
- Datové struktury, kde by zbylé hodnoty typu „garbage“ způsobovaly nenápadné, obtížnětraca chyby.
- Buffers, jejichž délka závisí na vstupu uživatele nebo souboru načteném během běhu programu.
- Bloky jsou pro omezený zásobník příliš velké, protože calloc() čerpá z mnohem větší haldy.
Protože rezervovaný blok je souvislý a již vynulovaný, lze s ním okamžitě zacházet jako s polem připraveným k použití bez samostatné inicializační smyčky.
syntaxe calloc():
ptr = (cast_type *) calloc (n, size);
- Výše uvedený příklad příkazu calloc v C se používá k alokaci n paměťových bloků stejné velikosti.
- Po přidělení paměťového prostoru jsou všechny bajty inicializovány na nulu.
- Jedno ukazatel který je aktuálně na prvním bajtu přiděleného paměťového prostoru je vrácen.
Kdykoli dojde k chybě při přidělování paměťového prostoru, jako je například nedostatek paměti, vrátí se nulový ukazatel, jak je znázorněno v níže uvedeném příkladu calloc.
Jak používat calloc
Níže uvedený program calloc v C vypočítá součet aritmetické sekvence.
#include <stdio.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \ n "); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
Výsledek calloc v příkladu C:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
Rozdíl mezi calloc() a malloc()
Funkce calloc() a malloc() rezervují paměť na haldě a obě vracejí ukazatel typu void neboli NULL v případě selhání, liší se však ve třech praktických ohledech, které rozhodují o tom, který z nich použít.
- Inicializace: calloc() nastaví každý bajt v novém bloku na nulu, zatímco malloc() ponechá obsah neinicializovaný, takže blok malloc() uchovává nepředvídatelný odpad, dokud do něj program nezapíše.
- Argumenty: calloc() přijímá dva argumenty, počet prvků a velikost každého z nich, zapsáno jako calloc(n, size); malloc() přijímá jeden argument, celkový počet bajtů, zapsáno jako malloc(n * size).
- Rychlost: malloc() je o něco rychlejší, protože přeskakuje krok nulování, a proto ji kód, který okamžitě přepisuje paměť, často preferuje.
Obě funkce jsou deklarovány v souboru stdlib.h a obě uvolňují paměť stejnou funkcí free(). Funkci calloc() zvolte, když je důležitý čistý, nulovaný blok, a funkci malloc() zvolte, když je preferována rychlost a program si inicializaci zpracovává sám.
Jak uvolnit paměť alokovanou funkcí calloc()
Paměť rezervovaná funkcí calloc() se nachází na haldě a nikdy se automaticky neuvolní. Když program neustále alokuje paměť bez uvolnění, pomalu spotřebovává veškerou dostupnou paměť, což je chyba známá jako únik paměti. Funkce free() vrací do systému dokončený blok, takže prostor lze znovu použít při pozdějších alokacích.
Funkce free() přijímá jeden argument, ukazatel, který vrátila funkce calloc(), a uvolňuje celý blok najednou:
int *ptr; ptr = calloc(10, sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Pro bezpečnou správu paměti calloc() dodržujte tato pravidla:
- Volejte free() právě jednou pro každé úspěšné calloc(); uvolnění stejného bloku dvakrát způsobí nedefinované chování.
- Po uvolnění nastavte ukazatel na hodnotu NULL, aby jej nebylo možné znovu použít jako volný ukazatel.
- Nikdy neuvolňuje() ukazatel, který calloc() nevrátila, včetně ukazatele posunutého ukazatelovou aritmetikou.
- Každou alokaci porovnejte s uvolněním, než ukazatel opustí rozsah platnosti.
Protože funkce calloc() a malloc() čerpají ze stejné haldy, je postup uvolnění pro obě funkce shodný: jedna funkce free() pro každou úspěšnou alokaci a poté žádný přístup k bloku.ping Alokace a uvolňování v rovnováze je základním zvykem manuální správy paměti v jazyce C a zabraňuje jak únikům, tak pádům způsobeným opětovným použitím paměti, která již byla vrácena.
