podstawowa różnica między funkcją malloc i calloc polega na tym, że calloc() potrzebuje dwóch argumentów zamiast jednego, który jest wymagany przez malloc(). Zarówno malloc (), jak i calloc () są funkcjami, które język programowania C zapewnia do dynamicznej alokacji pamięci i de-alokacji w czasie wykonywania.
zanim zrozumiemy funkcje malloc() i calloc (), najpierw zrozumiemy znaczenie dynamicznej alokacji pamięci. Alokacja pamięci to procedura przypisywania pamięci komputera do wykonywania programów i procesów. Stosujemy techniki dynamicznej alokacji, gdy nie wiadomo wcześniej, ile miejsca w pamięci jest potrzebne programowi i procesowi.
dynamiczna alokacja pamięci powstaje z powodu problemów związanych ze statyczną alokacją pamięci, takich jak zapisanie mniejszej liczby elementów, niepotrzebnie marnowana jest reszta pamięci. Dlatego rozwiązuje problemy statycznej alokacji pamięci, gdzie pamięć jest przydzielana tylko wtedy, gdy jest wymagana.
treść: malloc() Vs calloc()
- Tabela porównawcza
- definicja
- kluczowe różnice
- wnioski
Tabela porównawcza
podstawa porównania | malloc() | calloc() |
---|---|---|
liczba bloków | przypisuje pojedynczy blok żądanej pamięci. | przypisuje wiele bloków żądanej pamięci. |
składnia | void * malloc (size_t size); | void * calloc (size_t num, size_t size); |
malloc() nie wyczyszcza i nie inicjalizuje przydzielonej pamięci. | przydzielona pamięć jest inicjowana do zera za pomocą 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ść | szybko | stosunkowo wolno. |
definicja malloc ()
funkcja malloc przypisuje blok pamięci w bajtach. Użytkownik powinien wyraźnie podać rozmiar bloku, który jest wymagany do użycia.
poprzez funkcję malloc program żąda pamięci RAM systemu do alokacji pamięci, jeśli żądanie jest zaakceptowane (tzn. funkcja malloc mówi, że alokacja pamięci powiodła się), zwraca wskaźnik do pierwszego bloku pamięci. Zwraca typ wskaźnika void, co oznacza, że można przypisać dowolny typ wskaźnika.
chociaż 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, w pliku nagłówkowym alloc.h
lub stdlib.h
, a w systemie UNIX będzie dostępna w pliku nagłówkowym <malloc.h>
.
składnia
składnia tej funkcji jest następująca:
malloc(number of elements * size of each element);
na przykładint *ptr;
ptr=malloc(10*sizeof (int))
gdzie size oznacza rozmiar pamięci wymaganej w bajtach(tj., liczba sąsiadujących lokalizacji pamięci, które mają zostać przydzielone).
ale jak wspomniano wcześniej, funkcja malloc zwraca wskaźnik void, w związku z czym operator cast jest zobowiązany do zmiany zwracanego typu wskaźnika w oparciu o naszą potrzebę, powyższa deklaracja może być przedstawiona w następującej formie:
ptr_var=(type_cast* ) malloc (size)
gdzie ptr_var
to nazwa wskaźnika, który zachowuje adres początkowy przydzielonego bloku pamięci, type_cast
to typ danych, do którego zwrócony wskaźnik (lub typ void) ma zostać przekształcony, a size opisuje rozmiar wskaźnika, który przydzielany blok 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 aby sprawdzić, czy odpowiednie żądanie jest generowane przez malloc, aby przydzielić pamięć przyznaną przez Ram systemowy, lub odrzucone (w przypadku, gdy wymagane miejsce nie jest dostępne). Możemy skorzystać z właściwości, w której potrzebna ilość pamięci nie jest przypisana funkcja malloc Zwraca wartość NULL.
definicja calloc ()
funkcja calloc działa dokładnie tak samo jak funkcja malloc, wyłączając fakt, że wymaga dwóch argumentów, ponieważ 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. I 10 oznacza liczbę elementów, dla których ma być dokonana alokacja.
pamiętaj, że argument przekazany do funkcji malloc był (n*10), jest to pojedynczy argument nie myl się, ponieważ wiele argumentów jest zawsze oddzielonych przecinkami. Argument (n*10) nie ma przecinków pomiędzy. Stąd jest to pojedynczy argument, choć nie prosty, ale wyrażenie.
Wracając do powyższej deklaracji, po wykonaniu powyższej instrukcji, blok pamięci o długości 20 bajtów jest przydzielany do żądającego programu i adres pierwszego bloku jest przypisany do żądającego programu, a adres pierwszego bloku jest przypisany do wskaźnika ptr.
pamięć przydzielona przez funkcję calloc zawiera wszystkie zera. Funkcja calloc jest również dostępna w pliku nagłówkowym<stdlib.h>
lub<alloc.h>
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 przypisany w malloc, podczas gdy wiele bloków żądanej pamięci jest przydzielanych przez calloc.
- funkcja malloc nie czyści i inicjalizuje przydzieloną pamięć. Zawiera wartość śmieci i pozycja przydzielonej pamięci nie może być zmieniona. Natomiast calloc inicjalizuje przydzieloną pamięć na zero.
- malloc jest szybszy niż calloc ze względu na wymóg dodatkowych kroków inicjalizacji w calloc, ale różnica jest znikoma.
- inna różnica między tymi dwoma jest taka, że calloc jest malloc+memset, memset alokuje strony fizyczne 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ą swoją pewną zaletę, a wada jak malloc jest szybki w porównaniu do calloc. Co więcej, malloc jest łatwiejszy w użyciu, ponieważ zajmuje tylko jeden argument, ponieważ calloc alokuje pamięć i inicjalizuje obszar pamięci zerem. Ale wolałbyś używać calloc, gdy inicjalizacja zmiennych jest dla ciebie ważniejsza.