Menu
Coddy logo textTech

Alokacja za pomocą calloc()

Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 36 z 63.

Chociaż malloc() jest najczęściej używaną funkcją do dynamicznego przydzielania pamięci, C oferuje inną przydatną alternatywę: calloc(). Funkcja calloc(), której nazwa oznacza „przydzielanie ciągłe”, to wygodny sposób przydzielania pamięci dla tablic, który ma dodatkową, istotną zaletę.

W przeciwieństwie do malloc(), które przyjmuje jeden argument (łączną liczbę bajtów), calloc() przyjmuje dwa argumenty: liczbę elementów, które chcesz zaalokować, oraz rozmiar każdego elementu. Dzięki temu jest szczególnie intuicyjne podczas pracy z tablicami. Na przykład:

#include <stdlib.h>

// Przydziel pamięć na 5 liczb całkowitych za pomocą calloc()
int *arr = (int*)calloc(5, sizeof(int));

// Jest to równoważne: malloc(5 * sizeof(int))

Kluczową zaletą calloc() jest to, że automatycznie inicjalizuje cały przydzielony obszar pamięci zerami. Gdy używasz malloc(), przydzielony obszar pamięci zawiera dowolne wartości, które były tam wcześniej zapisane, ale calloc() gwarantuje, że każdy bajt ma wartość zero. Oznacza to, że wszystkie liczby całkowite będą miały wartość 0, wszystkie liczby zmiennoprzecinkowe 0.0, a wszystkie wskaźniki będą miały wartość NULL.

Podobnie jak malloc(), calloc() zwraca wskaźnik do przydzielonej pamięci lub NULL, jeśli przydzielanie się nie powiedzie, dlatego zawsze sprawdzaj, czy przydzielanie się nie powiodło, i pamiętaj, aby zwolnić pamięć za pomocą free(), gdy skończysz z niej korzystać.

challenge icon

Wyzwanie

Łatwy

Napisz program w C demonstrujący użycie calloc() do dynamicznej alokacji pamięci z automatyczną inicjalizacją zerami. Twój program powinien:

  1. Wczytać od użytkownika liczbę całkowitą size określającą liczbę liczb całkowitych do zaalokowania
  2. Użyć calloc(), aby dynamicznie zaalokować pamięć na tablicę zawierającą size liczb całkowitych
  3. Sprawdzić, czy alokacja pamięci się powiodła — jeśli nie, wypisać Memory allocation failed! i zakończyć program
  4. Jeśli alokacja się powiedzie, wypisać Memory allocated and initialized to zero!
  5. Wypisać wszystkie początkowe wartości w tablicy, aby pokazać, że są równe zeru, w formacie: Initial values: [value1] [value2] [value3] ...
  6. Wczytać od użytkownika size wartości całkowitych i zapisać je w zaalokowanej tablicy
  7. Wypisać wszystkie zaktualizowane wartości w formacie: Updated values: [value1] [value2] [value3] ...
  8. Obliczyć i wypisać sumę wszystkich wartości w formacie: Sum: [value]
  9. Użyć free(), aby zwolnić pamięć
  10. Wypisać Memory freed!, aby potwierdzić zwolnienie pamięci

Pamiętaj, aby dołączyć nagłówek <stdlib.h>, by użyć calloc() i free(). To wyzwanie pokazuje główną zaletę calloc() w porównaniu z malloc(): automatyczną inicjalizację całej zaalokowanej pamięci zerami.

Na przykład, jeśli dane wejściowe to:

3
10 20 30

Wynik powinien być następujący:

Memory allocated and initialized to zero!
Initial values: 0 0 0
Updated values: 10 20 30
Sum: 60
Memory freed!

To wyzwanie pokazuje, jak calloc() zapewnia czysty i przewidywalny stan początkowy dynamicznie zaalokowanych tablic, eliminując nieprzewidywalne śmieciowe wartości, które może pozostawić malloc().

Spróbuj swoich sił

#include <stdio.h>
#include <stdlib.h>

int main() {
    int size;
    
    // Wczytaj rozmiar tablicy
    scanf("%d", &size);
    
    // TODO: Napisz swój kod poniżej
    // Użyj calloc(), aby przydzielić pamięć dla tablicy
    // Sprawdź, czy przydzielenie pamięci się powiodło
    // Wypisz wartości początkowe (powinny być równe zero)
    // Wczytaj i zapisz wartości wejściowe
    // Wypisz zaktualizowane wartości
    // Oblicz i wypisz sumę
    // Zwolnij przydzieloną pamięć
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i sterowanie przepływem

Poćwicz samodzielnie: Kompilator C online