Když calloc se používá k přidělení bloku paměti, alokovaná oblast je inicializována na nuly. V porovnání, malloc nedotýká se obsahu přiděleného bloku paměti, což znamená, že obsahuje hodnoty odpadu. Může to být potenciálně bezpečnostní riziko, protože obsah paměti je nepředvídatelný a chyby v programování mohou vést k úniku tohoto obsahu.
calloc | malloc | |
---|---|---|
Funkce | přiděluje oblast paměti dostatečně velkou, aby pojala „n elementů“ „velikost“ bytů. Také inicializuje obsah paměti na nulu. | přiděluje "velikost" bajtů paměti. |
Počet argumentů | 2 | 1 |
Syntax | void * calloc (number_of_blocks, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Obsah přidělené paměti | Přidělená oblast je inicializována na nulu. | Obsah přidělené paměti se nezmění. tj. paměť obsahuje nepředvídatelné nebo odpadkové hodnoty. To představuje riziko. |
Vrácená hodnota | ukazatel neplatné (neplatné *). Pokud je přidělení úspěšné, vrátí se ukazatel na blok paměti. Pokud alokace paměti selže, je vrácen ukazatel NULL. | ukazatel neplatné (neplatné *). Pokud je přidělení úspěšné, vrátí se ukazatel na blok paměti. Pokud alokace paměti selže, je vrácen ukazatel NULL. |
void * malloc (size_t size);
přiděluje velikost
bajtů paměti. Pokud alokace uspěje, je vrácen ukazatel na alokovanou paměť. v opačném případě NULA
je vrácena. Příklad:
/ * Přidělení paměti pro pole s 15 prvky typu int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Paměť nemohla být přidělena, proto vytiskněte chybu a ukončete. * / fprintf (stderr, "Nelze alokovat paměť \ n"); exit (EXIT_FAILURE); / * Přidělení proběhlo úspěšně. * /
Všimněte si, že malloc
vyžaduje, abychom vypočítali bajty paměti, které potřebujeme, a předali to jako argument malloc.
void * calloc (size_t nelements, size_t bytes);
přiděluje souvislý blok paměti dostatečně velký na to, aby ho bylo možné držet šňůry
velikosti bajtů
každý. Přidělená oblast je inicializována na nulu. Ve výše uvedeném příkladu:
/ * Přidělte prostor pro pole s 15 prvky typu int a inicializovat na nulu. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * Paměť nemohla být přidělena, proto vytiskněte chybu a ukončete. * / fprintf (stderr, "Nelze alokovat paměť \ n"); exit (EXIT_FAILURE); / * Přidělení proběhlo úspěšně. * /
calloc (m, n) je stejný jako
p = malloc (m * n); pokud (p) memset (p, 0, m * n);
Tento výukový program vysvětluje funkce přidělování paměti malloc
, calloc
a realloc
, stejně jako funkce delokace paměti volný, uvolnit
:
Obecně je dobrý nápad používat calloc
přes malloc
. Při použití malloc je obsah alokované paměti nepředvídatelný. Chyby programování mohou způsobit neúmyslný, ale vysoce zranitelný způsob úniku tohoto obsahu paměti. Dobrým příkladem takového úniku je zranitelnost Heartbleed v OpenSSL, jejíž základní mechanismus je vysvětlen v tomto komiksu XKCD a další technické podrobnosti jsou v tomto blogovém příspěvku..
calloc je nepatrně pomalejší než malloc kvůli dalšímu kroku inicializace přidělené oblasti paměti. V praxi je však rozdíl v rychlosti velmi malý a lze jej ignorovat.