Calloc vs. Malloc
- 938
- 239
- Pelagia Radomski
Gdy calloc służy do przydzielania bloku pamięci, przydzielony region jest inicjowany do zera. W przeciwieństwie, Malloc nie dotyka zawartości przydzielonego bloku pamięci, co oznacza, że zawiera wartości śmieci. Może to potencjalnie być ryzykiem bezpieczeństwa, ponieważ zawartość pamięci jest nieprzewidywalna, a błędy programowania mogą spowodować wyciek tych zawartości.
Wykres porównania
Różnice - podobieństwa -calloc | Malloc | |
---|---|---|
Funkcjonować | Przydziela region pamięci wystarczająco duży, aby pomieścić „n elementy” bajtów „rozmiaru”. Inicjuje również zawartość pamięci do zera. | Przydziela bajty „Rozmiar” pamięci. |
Liczba argumentów | 2 | 1 |
Składnia | void *calloc (numer_of_blocks, size_of_each_block_in_bytes); | void *malloc (size_in_bytes); |
Zawartość przydzielonej pamięci | Przydzielony region jest inicjowany do zera. | Zawartość przydzielonej pamięci nie jest zmieniana. I.mi., Pamięć zawiera nieprzewidywalne lub śmieciowe wartości. To stanowi ryzyko. |
Wartość zwracana | Wskaźnik void (void *). Jeśli alokacja się powiedzie, wskaźnik do bloku pamięci jest zwracany. Jeśli alokacja pamięci się nie powiedzie, zwracany jest wskaźnik zerowy. | Wskaźnik void (void *). Jeśli alokacja się powiedzie, wskaźnik do bloku pamięci jest zwracany. Jeśli alokacja pamięci się nie powiedzie, zwracany jest wskaźnik zerowy. |
Składnia i przykłady
Malloc ()
void *malloc (rozmiar size_t);
przydziela rozmiar
bajty pamięci. Jeśli alokacja się powiedzie, wskaźnik do przydzielonej pamięci jest zwracany. W przeciwnym razie ZERO
jest zwrócony. Przykład:
/* Przydziela pamięć do tablicy z 15 elementami typu int. */ int *ptr = Malloc (15 *sizeof (int)); if (ptr == null) /* pamięć nie można przydzielić, więc wydrukuj błąd i wyjdź. */ fprintf (stderr, „nie mógł przydzielić pamięci \ n”); exit (exit_failure); /* Alokacja powiodła się. */
Zauważ, że Malloc
wymaga obliczania bajtów pamięci, których potrzebujemy i przekazali to jako argument do Malloc.
calloc ()
void *calloc (size_t nelements, size_t bajty);
Przydziela przylegający blok pamięci wystarczająco duży, aby zatrzymać Nelementy
wielkościowy bajty
każdy. Przydzielony region jest inicjowany do zera. W powyższym przykładzie:
/* Przydziela miejsce na tablicę z 15 elementami typu int i zainicjuj do zera. */ int *ptr = calloc (15, sizeof (int)); if (ptr == null) /* pamięć nie można przydzielić, więc wydrukuj błąd i wyjdź. */ fprintf (stderr, „nie mógł przydzielić pamięci \ n”); exit (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
Ten samouczek wideo wyjaśnia funkcje alokacji pamięci Malloc
, calloc
I Realloc
, a także funkcja de-alokacji pamięci bezpłatny
:
Względy bezpieczeństwa
Zasadniczo warto użyć calloc
nad Malloc
. Kiedy używasz Malloc, zawartość przydzielonej pamięci jest nieprzewidywalna. Błędy programowania mogą powodować wyciek tych zawartości pamięci w niezamierzone, ale bardzo wrażliwe sposoby. Dobrym przykładem takiego wycieku jest podatność na serce w Openssl, którego podstawowy mechanizm jest wyjaśniony w tym komiksie XKCD, a w tym poście na blogu znajdują się więcej szczegółów technicznych.
Prędkość wykonania
Calloc jest nieco wolniejszy niż Malloc ze względu na dodatkowy etap inicjowania przydzielonego regionu pamięci. Jednak w praktyce różnica prędkości jest bardzo mała i można ją zignorować.