Calloc vs. Malloc

Calloc vs. Malloc

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 kontra Malloc Chart
callocMalloc
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ć.