calloc vs. malloc

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.

Srovnávací tabulka

Rozdíly - podobnosti - srovnávací tabulka calloc versus malloc
callocmalloc
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.

Obsah: calloc vs. malloc

  • 1 Syntaxe a příklady
    • 1,1 malloc ()
    • 1,2 calloc ()
  • 2 Video vysvětlující Calloc, Malloc a Realloc
  • 3 Bezpečnostní aspekty
  • 4 Rychlost provedení
  • 5 Reference

Syntaxe a příklady

malloc ()

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.

calloc ()

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); 

Video vysvětlující Calloc, Malloc a Realloc

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:

Bezpečnostní aspekty

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..

Rychlost provedení

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.

Reference

  • calloc mužská stránka
  • malloc mužská stránka