calloc() funkcija u C biblioteci s programom PRIMJER
⚡ Pametni sažetak
calloc() u C-u rezervira više susjednih blokova memorije na hrpi i inicijalizira svaki bajt na nulu, vraćajući pokazivač void koji omogućuje programima stvaranje čistih, spremnih za korištenje nizova i struktura podataka tijekom izvođenja.
Što je calloc u C-u?
Calloc() u C-u je funkcija koja se koristi za dodjeljivanje više blokova memorije iste veličine. To je funkcija dinamičke alokacije memorije koja dodjeljuje memorijski prostor složenim strukturama podataka kao što su nizovi i strukture te vraća vaid pokazivač na memoriju. Calloc je kratica za susjednu alokaciju (contiguous allocation).
Malloc funkcija koristi se za dodjelu jednog bloka memorijskog prostora dok se funkcija calloc u C-u koristi za dodjelu više blokova memorijskog prostora. Svaki blok koji dodjeljuje calloc u C programiranju iste je veličine.
Zašto koristiti calloc() u C-u?
Obične varijable i nizovi fiksne veličine zaključavaju svoje dimenzije prilikom kompajliranja programa, što rasipa prostor kada je potrebno manje elemenata, a potpuno ne uspijeva kada ih je potrebno više. calloc() uklanja to ograničenje rezerviranjem memorije tijekom izvođenja i, za razliku od malloc(), briše svaki bajt na nulu prije vraćanja bloka. Zbog toga je calloc() prirodni izbor kad god programu treba čisto, predvidljivo područje memorije za niz ili strukturu čija je veličina poznata samo dok se kod izvršava.
Dinamička alokacija s calloc() odgovara nekoliko uobičajenih situacija:
- Numerički nizovi koji bi trebali počinjati od nule, kao što su brojači, histogrami ili akumulatori koji rade.
- Strukture podataka gdje bi preostale vrijednosti "smeća" uzrokovale suptilne, teško razumljivetraci kukci.
- Bufferčija duljina ovisi o korisničkom unosu ili datoteci koja se čita tijekom izvođenja programa.
- Blokovi preveliki za ograničeni stog, budući da calloc() crpi iz puno većeg heapa.
Budući da je rezervirani blok susjedni i već poništen, može se odmah tretirati kao niz spreman za upotrebu bez zasebne petlje inicijalizacije.
calloc() Sintaksa:
ptr = (cast_type *) calloc (n, size);
- Gornji primjer naredbe calloc u C-u koristi se za dodjelu n memorijskih blokova iste veličine.
- Nakon što je memorijski prostor dodijeljen, svi bajtovi se inicijaliziraju na nulu.
- The pokazivač koji je trenutno na prvom bajtu dodijeljenog memorijskog prostora se vraća.
Kad god postoji pogreška pri dodjeli memorijskog prostora kao što je nedostatak memorije, tada se vraća nulti pokazivač kao što je prikazano u donjem primjeru calloc.
Kako koristiti calloc
Donji calloc program u C-u izračunava zbroj aritmetičkog niza.
#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; }
Rezultat calloc-a u C primjeru:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
Razlika između calloc() i malloc()
calloc() i malloc() rezerviraju memoriju na hrpi i oba vraćaju void pokazivač ili NULL u slučaju neuspjeha, no razlikuju se na tri praktična načina koji određuju koji će se koristiti.
- Inicijalizacija: calloc() postavlja svaki bajt u novom bloku na nulu, dok malloc() ostavlja sadržaj neinicijaliziranim, pa malloc() blok sadrži nepredvidivo smeće dok program ne zapiše u njega.
- Argumenti: calloc() prima dva argumenta, broj elemenata i veličinu svakog, zapisano kao calloc(n, size); malloc() prima jedan argument, ukupan broj bajtova, zapisano kao malloc(n * size).
- Brzina: malloc() je neznatno brži jer preskače korak nuliranja, zbog čega ga kod koji odmah prepisuje memoriju često preferira.
Obje funkcije su deklarirane u stdlib.h i obje oslobađaju memoriju istom funkcijom free(). Odaberite calloc() kada je važan čisti, nulti blok, a malloc() kada je poželjna sirova brzina i program sam obrađuje inicijalizaciju.
Kako osloboditi memoriju dodijeljenu pomoću calloc()
Memorija rezervirana funkcijom calloc() nalazi se na hrpi i nikada se ne oslobađa automatski. Kada program nastavlja alocirati bez oslobađanja, polako troši svu dostupnu memoriju, što je defekt poznat kao curenje memorije. Funkcija free() vraća završeni blok sustavu tako da se prostor može ponovno koristiti kasnijim alokacijama.
Funkcija free() prima jedan argument, pokazivač koji je vratila funkcija calloc(), i odjednom oslobađa cijeli 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 */ }
Slijedite ova pravila za sigurno upravljanje memorijom calloc():
- Pozovite free() točno jednom za svaki uspješan calloc(); oslobađanje istog bloka dva puta uzrokuje nedefinirano ponašanje.
- Nakon oslobađanja, postavite pokazivač na NULL kako se ne bi mogao ponovno koristiti kao viseći pokazivač.
- Nikad ne oslobađa() pokazivač koji calloc() nije vratio, uključujući i onaj pomaknut pokazivačkom aritmetikom.
- Uskladi svaku alokaciju s oslobađanjem prije nego što pokazivač izađe izvan dosega.
Budući da i calloc() i malloc() crpe iz istog heapa, disciplina oslobađanja je identična za obje funkcije: jedan free() za svaku uspješnu alokaciju i nakon toga nema pristupa bloku. Keeping Dodjela i oslobađanje u ravnoteži osnovna je navika ručnog upravljanja memorijom u C-u i sprječava i curenje i pad sustava uzrokovane ponovnom upotrebom memorije koja je već vraćena.

