Funkcja calloc() w bibliotece C z PRZYKŁADOWYM programem
⚡ Inteligentne podsumowanie
Funkcja calloc() w języku C rezerwuje wiele ciągłych bloków pamięci na stercie i inicjuje każdy bajt zerem, zwracając wskaźnik typu void, który umożliwia programom tworzenie czystych, gotowych do użycia tablic i struktur danych w czasie wykonywania.
Co to jest calloc w C?
Funkcja calloc() w języku C służy do alokacji wielu bloków pamięci o tym samym rozmiarze. Jest to dynamiczna funkcja alokacji pamięci, która przydziela przestrzeń pamięci złożonym strukturom danych, takim jak tablice i struktury, i zwraca wskaźnik typu void do pamięci. Calloc to skrót od contiguous allocation (alokacja ciągła).
Funkcja Malloca służy do przydzielania pojedynczego bloku przestrzeni pamięci, podczas gdy funkcja calloc w C służy do przydzielania wielu bloków przestrzeni pamięci. Każdy blok przydzielony przez calloc w programowaniu C ma ten sam rozmiar.
Dlaczego warto używać calloc() w C?
Zwykłe zmienne i tablice o stałym rozmiarze blokują swoje wymiary podczas kompilacji programu, co marnuje miejsce, gdy potrzeba mniej elementów, i całkowicie zawodzi, gdy potrzeba więcej. Funkcja calloc() eliminuje to ograniczenie, rezerwując pamięć w czasie wykonywania i, w przeciwieństwie do malloc(), zeruje każdy bajt przed przekazaniem bloku. To sprawia, że calloc() jest naturalnym wyborem, gdy program potrzebuje czystego, przewidywalnego obszaru pamięci dla tablicy lub struktury, której rozmiar jest znany tylko podczas działania kodu.
Dynamiczna alokacja za pomocą calloc() sprawdza się w kilku typowych sytuacjach:
- Tablice numeryczne, które powinny zaczynać się od zera, takie jak liczniki, histogramy lub akumulatory bieżące.
- Struktury danych, w których pozostałe wartości śmieciowe powodowałyby subtelne, trudne dotraci robaków.
- Bufferktórych długość zależy od danych wprowadzonych przez użytkownika lub pliku odczytanego podczas działania programu.
- Bloki są zbyt duże dla ograniczonego stosu, ponieważ calloc() czerpie dane z dużo większego stosu.
Ponieważ zarezerwowany blok jest ciągły i już wyzerowany, można go od razu traktować jako gotową do użycia tablicę, bez konieczności przeprowadzania oddzielnej pętli inicjalizacji.
calloc() Składnia:
ptr = (cast_type *) calloc (n, size);
- Powyższy przykład instrukcji calloc w C 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.
- wskaźnik który aktualnie znajduje się na pierwszym bajcie przydzielonej przestrzeni pamięci.
Ilekroć wystąpi błąd przy alokacji miejsca w pamięci, taki jak brak pamięci, zwracany jest wskaźnik zerowy, jak pokazano w poniższym przykładzie calloc.
Jak korzystać z Calloc
Poniższy program calloc w C oblicza sumę ciągu arytmetycznego.
#include <stdio.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; }
Wynik calloc w przykładzie C:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
Różnica między calloc() i malloc()
Zarówno calloc(), jak i malloc() rezerwują pamięć na stercie i obie zwracają wskaźnik typu void lub wartość NULL w przypadku błędu. Różnią się jednak trzema praktycznymi sposobami, które decydują o tym, której z nich użyć.
- Inicjalizacja: calloc() ustawia każdy bajt w nowym bloku na zero, podczas gdy malloc() pozostawia zawartość niezainicjowaną, więc blok malloc() przechowuje nieprzewidywalne śmieci, dopóki program do niego nie zapisze.
- Argumenty: calloc() przyjmuje dwa argumenty: liczbę elementów i rozmiar każdego z nich, zapisywane jako calloc(n, size); malloc() przyjmuje pojedynczy argument, całkowitą liczbę bajtów, zapisywane jako malloc(n * size).
- Szybkość: malloc() jest nieznacznie szybszy, ponieważ pomija krok zerowania, dlatego kod, który natychmiast nadpisuje pamięć, często go preferuje.
Obie funkcje są zadeklarowane w stdlib.h i obie zwalniają pamięć za pomocą tej samej funkcji free(). Wybierz calloc(), gdy liczy się czysty, wyzerowany blok, a malloc(), gdy preferowana jest prędkość, a program sam obsługuje inicjalizację.
Jak zwolnić pamięć przydzieloną przez calloc()
Pamięć zarezerwowana przez calloc() znajduje się na stercie i nigdy nie jest automatycznie zwalniana. Gdy program stale alokuje pamięć bez jej zwalniania, powoli zużywa całą dostępną pamięć – jest to defekt znany jako wyciek pamięci. Funkcja free() zwraca systemowi ukończony blok, aby przestrzeń mogła zostać ponownie wykorzystana w późniejszych alokacjach.
Funkcja free() przyjmuje pojedynczy argument – wskaźnik zwrócony przez calloc() – i natychmiast zwalnia cały blok:
int *ptr; ptr = calloc(10, sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Aby bezpiecznie zarządzać pamięcią calloc(), postępuj zgodnie z poniższymi zasadami:
- Wywołuj free() dokładnie raz dla każdego pomyślnego calloc(); dwukrotne zwolnienie tego samego bloku powoduje niezdefiniowane zachowanie.
- Po zwolnieniu ustaw wskaźnik na NULL, aby nie można było go ponownie wykorzystać jako wskaźnika wiszącego.
- Nigdy nie zwalniaj wskaźnika, którego calloc() nie zwróciło, w tym wskaźnika przesuniętego przez arytmetykę wskaźnika.
- Dopasuj każdą alokację do wydania zanim wskaźnik wyjdzie poza zakres.
Ponieważ funkcje calloc() i malloc() pobierają dane z tego samego stosu, procedura zwalniania jest identyczna dla obu funkcji: jedno zwolnienie() dla każdego pomyślnego przydzielenia i brak dostępu do bloku po tym.ping równomierne przydzielanie i zwalnianie pamięci to podstawowa zasada ręcznego zarządzania pamięcią w języku C. Zapobiega ona wyciekom i awariom spowodowanym przez ponowne wykorzystanie zwróconej już pamięci.

