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ć.
Wyzwanie
ŁatwyNapisz program w C demonstrujący użycie calloc() do dynamicznej alokacji pamięci z automatyczną inicjalizacją zerami. Twój program powinien:
- Wczytać od użytkownika liczbę całkowitą
sizeokreślającą liczbę liczb całkowitych do zaalokowania - Użyć
calloc(), aby dynamicznie zaalokować pamięć na tablicę zawierającąsizeliczb całkowitych - Sprawdzić, czy alokacja pamięci się powiodła — jeśli nie, wypisać
Memory allocation failed!i zakończyć program - Jeśli alokacja się powiedzie, wypisać
Memory allocated and initialized to zero! - Wypisać wszystkie początkowe wartości w tablicy, aby pokazać, że są równe zeru, w formacie:
Initial values: [value1] [value2] [value3] ... - Wczytać od użytkownika
sizewartości całkowitych i zapisać je w zaalokowanej tablicy - Wypisać wszystkie zaktualizowane wartości w formacie:
Updated values: [value1] [value2] [value3] ... - Obliczyć i wypisać sumę wszystkich wartości w formacie:
Sum: [value] - Użyć
free(), aby zwolnić pamięć - 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 30Wynik 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;
}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
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znaków6Zarządzanie pamięcią
Pamięć stosu a stertyAlokacja dynamiczna — malloc()Użycie sizeof() do alokacjiSprawdzanie niepowodzenia alokacjiZwalnianie pamięci za pomocą free()Alokacja za pomocą calloc()Podsumowanie: tablica dynamicznaPoćwicz samodzielnie: Kompilator C online