calloc vs. malloc

Gdy calloc służy do alokacji bloku pamięci, przydzielony region jest inicjowany na zero. W przeciwieństwie, malloc nie dotyka zawartości przydzielonego bloku pamięci, co oznacza, że ​​zawiera wartości śmieci. Może to potencjalnie stanowić zagrożenie bezpieczeństwa, ponieważ zawartość pamięci jest nieprzewidywalna, a błędy programowania mogą spowodować wyciek tej zawartości.

Wykres porównania

Różnice - podobieństwa - Tabela porównawcza Calloc kontra Malloc
callocmalloc
Funkcjonować przydziela obszar pamięci wystarczająco duży, aby pomieścić „n elementów” każdego „rozmiaru” bajtów. Inicjuje również zawartość pamięci do zera. przydziela „wielkość” bajtów pamięci.
Liczba argumentów 2) 1
Składnia void * calloc (liczba_bloków, rozmiar_dokładny_blok_w_bytach); void * malloc (size_in_bytes);
Zawartość przydzielonej pamięci Przydzielony region jest inicjowany na zero. Zawartość przydzielonej pamięci nie ulega zmianie. tzn. pamięć zawiera nieprzewidywalne lub śmieciowe wartości. To stwarza ryzyko.
Zwracana wartość void pointer (void *). Jeśli alokacja się powiedzie, zwracany jest wskaźnik do bloku pamięci. Jeśli przydział pamięci nie powiedzie się, zwracany jest wskaźnik NULL. void pointer (void *). Jeśli alokacja się powiedzie, zwracany jest wskaźnik do bloku pamięci. Jeśli przydział pamięci nie powiedzie się, zwracany jest wskaźnik NULL.

Zawartość: calloc vs. malloc

  • 1 Składnia i przykłady
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Wideo wyjaśniające Calloc, Malloc i Realloc
  • 3 Względy bezpieczeństwa
  • 4 Szybkość wykonania
  • 5 referencji

Składnia i przykłady

malloc ()

void * malloc (size_t size); 

przydziela rozmiar bajty pamięci. Jeśli alokacja się powiedzie, zostanie zwrócony wskaźnik do przydzielonej pamięci. Inaczej ZERO jest zwracany. Przykład:

/ * Przydziel pamięć dla tablicy zawierającej 15 elementów typu int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Nie można przydzielić pamięci, więc wydrukuj błąd i wyjdź. * / fprintf (stderr, „Nie można przydzielić pamięci \ n”); wyjście (EXIT_FAILURE);  / * Alokacja powiodła się. * / 

Zauważ, że malloc wymaga obliczenia potrzebnych bajtów pamięci i przekazania go jako argument malloc.

calloc ()

void * calloc (size_t nelements, size_t bytes); 

przydziela ciągły blok pamięci wystarczająco duży, aby pomieścić elementy wielkościowy bajty każdy. Przydzielony region jest inicjowany na zero. W powyższym przykładzie:

/ * Przydziel miejsce dla tablicy zawierającej 15 elementów typu int i zainicjować na zero. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * Nie można przydzielić pamięci, więc wydrukuj błąd i wyjdź. * / fprintf (stderr, „Nie można przydzielić pamięci \ n”); wyjście (EXIT_FAILURE);  / * Alokacja powiodła się. * / 

calloc (m, n) jest taki sam jak

p = malloc (m * n); if (p) memset (p, 0, m * n); 

Wideo wyjaśniające Calloc, Malloc i Realloc

W tym samouczku wideo opisano funkcje alokacji pamięci malloc, calloc i realloc, a także funkcja alokacji pamięci darmowy:

Względy bezpieczeństwa

Zasadniczo dobrym pomysłem jest użycie calloc nad malloc. Podczas korzystania z malloc zawartość przydzielonej pamięci jest nieprzewidywalna. Błędy programowania mogą powodować wyciek zawartości pamięci w niezamierzony, ale bardzo podatny sposób. Dobrym przykładem takiego wycieku jest luka Heartbleed w OpenSSL, której podstawowy mechanizm wyjaśniono w tym komiksie XKCD, a więcej szczegółów technicznych znajduje się w tym blogu.

Szybkość wykonania

calloc jest nieco wolniejszy niż malloc ze względu na dodatkowy krok inicjowania przydzielonego regionu pamięci. Jednak w praktyce różnica prędkości jest bardzo mała i można ją zignorować.

Bibliografia

  • calloc strona man
  • malloc strona man