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.
calloc | malloc | |
---|---|---|
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. |
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.
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);
W tym samouczku wideo opisano funkcje alokacji pamięci malloc
, calloc
i realloc
, a także funkcja alokacji pamięci darmowy
:
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.
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ć.