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

Kluczowe różnice między malloc() a calloc()

  • Funkcja malloc() zwraca tylko adres początkowy i nie ustawia go na zero, natomiast funkcja calloc() zwraca adres początkowy i ustawia go na zero.
  • W funkcji malloc liczba argumentów wynosi 1, natomiast w funkcji calloc liczba argumentów wynosi 2.
  • Efektywność czasowa malloc() jest wyższa niż calloc(), podczas gdy malloc() nie jest bezpieczna w porównaniu z calloc()
  • malloc nie inicjuje pamięci, podczas gdy calloc wykonuje inicjalizację pamięci.
malloc() vs calloc()
malloc() vs calloc()

Co to jest dynamiczna alokacja pamięci?

Dynamiczna alokacja pamięci to proces alokacji pamięci w czasie wykonywania. Istnieją cztery procedury biblioteczne: calloc(), free(), realloc()i malloc(), których można użyć do przydzielenia pamięci i zwolnienia jej podczas wykonywania programu. Procedury te są zdefiniowane w pliku nagłówkowym o nazwie stdlib.h.

Co to jest malloc()?

Jest to funkcja służąca do dynamicznego przydzielania bloku pamięci. Rezerwuje przestrzeń pamięci o określonym rozmiarze i zwraca wskaźnik zerowy wskazujący lokalizację pamięci.

Zwracany wskaźnik jest zwykle typu void. Oznacza to, że możemy przypisać funkcję malloc do dowolnego wskaźnika. Pełną formą malloc jest alokacja pamięci.

Co to jest calloc()?

Funkcja Calloc(). służy do przydzielania wielu bloków pamięci. Jest to dynamiczna funkcja przydzielania pamięci, która służy do przydzielania pamięci do złożonych struktur danych, takich jak tablice i struktury. Jeśli ta funkcja nie przydzieli wystarczającej ilości miejsca, jak określono, zwraca wskaźnik null. Pełna forma funkcji calloc to contiguous distribution.

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

Oto ważna różnica między malloc() a calloc():

malloc () kaloc()
Funkcja Malloc() utworzy pojedynczy blok pamięci o rozmiarze określonym przez użytkownika. Funkcja Calloc() może przypisać do zmiennej wiele bloków pamięci.
Funkcja Malloc zawiera wartość śmieciową. Blok pamięci przydzielony przez funkcję calloc jest zawsze inicjowany na zero.
Liczba argumentów to 1. Liczba argumentów wynosi 2.
Calloc jest wolniejszy niż malloc. Malloc jest szybszy niż Calloc.
Nie jest bezpieczny w porównaniu do Calloc. Jest bezpieczny w użyciu w porównaniu do malloc.
Efektywność czasowa jest wyższa niż calloc(). Efektywność czasowa jest niższa niż malloc().
Funkcja Malloc() zwraca tylko adres początkowy i nie powoduje zera. Przed przydzieleniem adresu funkcja Calloc() zwraca adres początkowy i ustawia go na zero.
Nie wykonuje inicjalizacji pamięci. Wykonuje inicjalizację pamięci.

Składnia malloc()

Oto składnia malloc()

ptr = (cast_type *) malloc (byte_size);

W powyższej składni ptr jest wskaźnikiem typu rzutu. Funkcja malloc zwraca wskaźnik do przydzielonej pamięci o rozmiarze bajtu.

Example: ptr = (int *) malloc (50)

Po pomyślnym wykonaniu tej instrukcji rezerwowana jest pamięć o wielkości 50 bajtów. Adres pierwszego bajtu zarezerwowanej przestrzeni przypisany jest do wskaźnika „ptr” typu int.

Składnia calloc()

Oto składnia malloc()

ptr = (cast_type *) calloc (n, size);

Powyższa składnia służy do alokacji n bloków pamięci o tym samym rozmiarze. Po przydzieleniu miejsca w pamięci wszystkie bajty są inicjowane na zero. Zwracany jest wskaźnik, który aktualnie znajduje się na pierwszym bajcie przydzielonej przestrzeni pamięci.

Przykład malloc() w C

W poniższym kodzie sizeof(*ptr) służy do alokacji bloku pamięci zawierającego 15 liczb całkowitych. W instrukcji printf znajdujemy wartość szóstej liczby całkowitej.

#include<stdlib.h>
#include<stdio.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); 
    if (ptr != NULL) {
      *(ptr + 5) = 480; 
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

Wyjście:

Wartość szóstej liczby całkowitej wynosi 6

Przykład calloc() w C

Poniższy program w języku C oblicza sumę pierwszych dziesięciu terminów. Jeśli wartość wskaźnika jest null, wówczas miejsce w pamięci nie zostanie przydzielone.

Pętla for służy do iteracji wartości zmiennej „i” i wydrukowania sumy. Na koniec funkcja free służy do zwalniania wskaźnika.

#include <stdio.h>
#include <stdlib.h>
    int main() {
        int i, * ptr, sum = 0;
        ptr = calloc(10, sizeof(int));
        if (ptr == NULL) {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Building and calculating the sequence sum of the first 10 terms \n");
        for (i = 0; i < 10; ++i) { * (ptr + i) = i;
            sum += * (ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }

Wyjście:

Budowanie i obliczanie sumy sekwencji pierwszych 10 wyrazów n Suma = 45

Po co używać malloc()?

Oto powody używania malloc()

  • Jeśli musisz przydzielić pamięć w czasie wykonywania, powinieneś użyć malloc().
  • Powinieneś używać malloc, gdy musisz przydzielić obiekty, które muszą istnieć poza wykonaniem bieżącego bloku pamięci.
  • Wybierz malloc(), jeśli chcesz przydzielić pamięć większą niż rozmiar tego stosu.
  • Zwraca wskaźnik do pierwszego bajtu przydzielonej przestrzeni.
  • Umożliwia programistom przydzielanie pamięci w dokładnie takiej ilości, jaka jest potrzebna.
  • Ta funkcja przydziela ze sterty rozmiar bloku pamięci wynoszący bajty.

Po co używać calloc()?

Oto powody używania calloc()

  • Kiedy musisz ustawić przydzieloną pamięć na zero.
  • Możesz użyć calloc, który zwraca wskaźnik, aby uzyskać dostęp do sterty pamięci.
  • Używane, gdy trzeba zainicjować elementy do zera, aby zwrócić wskaźnik do pamięci.
  • Aby zapobiec przepełnieniu, które jest możliwe w przypadku malloc()
  • Użyj funkcji calloc(), aby zażądać strony, o której wiadomo, że jest już wyzerowana.