logo

Różnica między malloc() i calloc() z przykładami

Funkcje malloc() I kaloc() to funkcje biblioteczne, które dynamicznie przydzielają pamięć. Dynamiczny oznacza, że ​​pamięć jest alokowana w czasie wykonywania (wykonywania programu) z segmentu sterty.

Inicjalizacja

malloc() przydziela blok pamięci o zadanym rozmiarze (w bajtach) i zwraca wskaźnik na początek bloku. malloc() nie inicjuje przydzielonej pamięci. Jeśli spróbujesz czytać z przydzielonej pamięci bez jej wcześniejszej inicjalizacji, wywołasz niezdefiniowane zachowanie, co zwykle oznacza, że ​​odczytane wartości będą wartościami śmieciowymi.



git dodaj --all

kaloc() przydziela pamięć, a także inicjuje każdy bajt w przydzielonej pamięci na 0. Jeśli spróbujesz odczytać wartość przydzielonej pamięci bez jej inicjalizacji, otrzymasz 0, ponieważ została ona już zainicjowana na 0 przez calloc().

Parametry

malloc() przyjmuje pojedynczy argument, którym jest liczba bajtów do przydzielenia.

W przeciwieństwie do malloc(), calloc() przyjmuje dwa argumenty:



  1. Liczba bloków do przydzielenia.
  2. Rozmiar każdego bloku w bajtach.

Wartość zwracana

Po pomyślnej alokacji w malloc() i calloc() zwracany jest wskaźnik do bloku pamięci, w przeciwnym razie zwracane jest NULL, co oznacza błąd.

Przykład

Poniższy kod C demonstruje różnicę między funkcjami malloc i calloc w celu alokacji pamięci dynamicznej.

C






// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> >// Both of these allocate the same number of bytes,> >// which is the amount of bytes that is required to> >// store 5 int values.> >// The memory allocated by calloc will be> >// zero-initialized, but the memory allocated with> >// malloc will be uninitialized so reading it would be> >// undefined behavior.> >int>* allocated_with_malloc =>malloc>(5 *>sizeof>(>int>));> >int>* allocated_with_calloc =>calloc>(5,>sizeof>(>int>));> >// As you can see, all of the values are initialized to> >// zero.> >printf>(>'Values of allocated_with_calloc: '>);> >for> (>size_t> i = 0; i <5; ++i) {> >printf>(>'%d '>, allocated_with_calloc[i]);> >}> >putchar>(>' '>);> >// This malloc requests 1 terabyte of dynamic memory,> >// which is unavailable in this case, and so the> >// allocation fails and returns NULL.> >int>* failed_malloc =>malloc>(1000000000000);> >if> (failed_malloc == NULL) {> >printf>(>'The allocation failed, the value of '> >'failed_malloc is: %p'>,> >(>void>*)failed_malloc);> >}> >// Remember to always free dynamically allocated memory.> >free>(allocated_with_malloc);> >free>(allocated_with_calloc);> }>

>

>

Wyjście

Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>

Różnica między malloc() i calloc() w C

Zobaczmy różnice w formie tabelarycznej:

tablica sortowania Java

Tak nie.

malloc()

kaloc()

1.

malloc() to funkcja, która tworzy jeden blok pamięci o stałym rozmiarze. calloc() to funkcja, która przypisuje określoną liczbę bloków pamięci do pojedynczej zmiennej.

2.

malloc() przyjmuje tylko jeden argument calloc() przyjmuje dwa argumenty.

3.

malloc() jest szybsza niż calloc. calloc() jest wolniejsze niż malloc()

4.

malloc() ma wysoką wydajność czasową calloc() ma niską wydajność czasową

5.

malloc() służy do wskazywania alokacji pamięci calloc() służy do wskazywania ciągłej alokacji pamięci

6.

Składnia: void* malloc(size_t size); Składnia: void* calloc(rozmiar_t liczba, rozmiar_t rozmiar);

8.

malloc() nie inicjuje pamięci do zera calloc() inicjuje pamięć do zera

9.

malloc() nie dodaje żadnego dodatkowego obciążenia pamięci calloc() dodaje dodatkowe obciążenie pamięci

Powiązane artykuły