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.
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:
- Liczba bloków do przydzielenia.
- 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:
| 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 |