Przed zrozumieniem funkcji malloc () i funkcji calloc () najpierw musimy zrozumieć znaczenie dynamicznego przydzielania pamięci. Przydzielanie pamięci jest procedurą przypisywania pamięci komputera do wykonywania programów i procesów. Używamy technik dynamicznej alokacji, gdy nie wiadomo, ile miejsca pamięci jest potrzebne dla programu i procesu.
Dynamiczna alokacja pamięci powstaje z powodu problemów związanych z alokacją pamięci statycznej, na przykład gdy mniej elementów jest przechowywanych, a następnie reszta pamięci jest niepotrzebnie marnowana. W związku z tym pokonuje problemy z alokacją pamięci statycznej, gdzie pamięć jest przydzielana tylko wtedy, gdy jest wymagana.
Wykres porównania
Podstawa porównania | malloc () | calloc () |
---|---|---|
Liczba bloków | Przypisuje pojedynczy blok wymaganej pamięci. | Przypisuje wiele bloków żądanej pamięci. |
Składnia | void * malloc (size_t size); | void * calloc (size_t num, size_t size); |
Inicjalizacja | malloc () nie usuwa i inicjuje przydzielonej pamięci. | Przydzielona pamięć jest inicjowana do zera za pomocą metody calloc (). |
Sposób alokacji | Funkcja malloc () przydziela pamięć o rozmiarze "size" ze sterty. | Funkcja calloc () przydziela pamięć, której rozmiar jest równy num * size. |
Prędkość | Szybki | Stosunkowo wolny. |
Definicja malloc ()
Funkcja malloc przypisuje blok pamięci w bajtach . Użytkownik powinien wyraźnie podać rozmiar bloku, który wymaga użycia.
Poprzez program funkcji malloc żąda pamięci RAM systemu do alokacji pamięci, jeśli żądanie zostanie przyznane (tj. Funkcja malloc powiedzie się z powodzeniem w przydzielaniu pamięci), zwróci wskaźnik do pierwszego bloku pamięci. Zwraca on wskaźnik typu void, co oznacza, że można przypisać dowolny typ wskaźnika.
Mimo to zwraca wartość NULL, jeśli funkcje malloc nie są w stanie przydzielić wymaganej ilości pamięci. Funkcja malloc jest dostępna w TURBO C, plik nagłówkowy alloc.h
lub stdlib.h
, aw systemie UNIX będzie dostępny w pliku nagłówkowym .
SKŁADNIA
Składnia tej funkcji jest następująca:
malloc(number of elements * size of each element);
na przykład, int *ptr;
ptr=malloc(10*sizeof (int))
Gdzie rozmiar reprezentuje rozmiar pamięci wymaganej w bajtach (tj. Liczbę przyległych lokalizacji pamięci, które mają zostać przydzielone).
Ale jak już wcześniej wspomniano, funkcja malloc zwraca wskaźnik void, w związku z czym operator cast jest wymagany do zmiany zwróconego typu wskaźnika w zależności od potrzeb, powyższa deklaracja może być przedstawiona w następującej formie:
ptr_var=(type_cast* ) malloc (size)
Gdzie ptr_var
jest nazwą wskaźnika, który zachowuje adres początkowy przydzielonego bloku pamięci, type_cast
jest typem danych, do którego ma zostać transformowany zwracany wskaźnik (lub typ void), a rozmiar opisuje rozmiar przydzielonego bloku pamięci w bajtach .
Na przykład: int *ptr;
ptr=(int*) malloc (10 * size of (int));
Pamięć przydzielona przez funkcję malloc zawiera wartość śmieci .
Zwróć uwagę, że w celu sprawdzenia, czy odpowiednie żądanie jest generowane przez malloc, aby przydzielić pamięć przyznaną przez systemową pamięć RAM, lub odrzucić (w przypadku, gdy wymagane miejsce nie jest dostępne). Możemy skorzystać z właściwości, w której wymagana ilość pamięci nie jest przypisana, funkcja malloc zwraca NULL.
Definicja calloc ()
Funkcja calloc działa dokładnie tak samo jak funkcja malloc z wyłączeniem faktu, że wymaga dwóch argumentów, jak w przypadku malloc () potrzebny jest tylko jeden argument.
Na przykład: int*ptr;
ptr = (int*)calloc(10, 2);
Tutaj 2 określa rozmiar typu danych w bajcie, dla którego chcemy dokonać alokacji, co w tym przypadku wynosi 2 dla liczb całkowitych. A 10 oznacza liczbę elementów, dla których należy dokonać alokacji.
Pamiętaj, że argument przekazany do funkcji malloc był (n * 10), jest to pojedynczy argument, którego nie należy mylić, ponieważ wiele argumentów jest zawsze oddzielonych przecinkami. Argument (n * 10) nie zawiera przecinków. Jest to zatem pojedynczy argument, choć nie jest prosty, ale jest wyrażeniem.
Wracając do powyższej deklaracji, po wykonaniu powyższej instrukcji blok pamięci złożony z 20 bajtów jest przydzielany do programu żądającego, a adres pierwszego bloku jest przypisywany do programu żądającego, a adres pierwszego bloku jest przypisywany do wskaźnika ptr.
Pamięć przydzielona przez funkcję calloc zawiera wszystkie zera. Funkcja calloc jest również dostępna w pliku nagłówkowym lub
w TURBO C.
Kluczowe różnice między malloc i calloc
Podstawowe różnice między funkcjami malloc i calloc to:
- Pojedynczy blok żądanej pamięci jest przydzielany w malloc, podczas gdy wiele bloków żądanej pamięci jest alokowanych przez calloc.
- Funkcja malloc nie kasuje i inicjalizuje przydzielonej pamięci. Zawiera wartość śmieci i nie można zmienić pozycji przydzielonej pamięci. Natomiast calloc inicjalizuje przydzieloną pamięć do zera.
- malloc jest szybszy od calloc ze względu na wymaganie dodatkowych kroków inicjalizacji w calloc, ale różnica jest znikoma.
- Inną różnicą między tymi dwoma jest to, że calloc jest zestawem malloc + memset, memset przydziela fizyczne strony w pamięci, podczas gdy malloc przypisuje tylko pamięć ze sterty w wirtualnym adresie.
Wniosek:
Zarówno funkcje malloc, jak i calloc są używane do alokacji pamięci i mają pewną przewagę, a wada taka jak malloc jest szybka w porównaniu do calloc. Co więcej, malloc jest łatwiejszy w użyciu, ponieważ przyjmuje tylko jeden argument, ponieważ calloc przydziela pamięć i inicjalizuje obszar pamięci za pomocą ZERO. Ale wolisz używać calloc, gdy inicjalizacja zmiennych jest dla ciebie ważniejsza.