calloc() Funktion i C-bibliotek med programeksempel
โก Smart opsummering
calloc() i C reserverer flere sammenhรฆngende hukommelsesblokke pรฅ heapen og initialiserer hver byte til nul, hvilket returnerer en void-pointer, der lader programmer oprette rene, brugsklare arrays og datastrukturer under kรธrsel.

Hvad er calloc i C?
calloc() i C er en funktion, der bruges til at allokere flere hukommelsesblokke af samme stรธrrelse. Det er en dynamisk hukommelsesallokeringsfunktion, der allokerer hukommelsesplads til komplekse datastrukturer sรฅsom arrays og strukturer og returnerer en void-pointer til hukommelsen. Calloc stรฅr for contiguous allocation (sammenhรฆngende allokering).
Malloc funktion bruges til at allokere en enkelt blok hukommelsesplads, mens calloc-funktionen i C bruges til at allokere flere hukommelsesblokke. Hver blok, der er allokeret af calloc'en i C-programmering, er af samme stรธrrelse.
Hvorfor bruge calloc() i C?
Almindelige variabler og arrays med fast stรธrrelse lรฅser deres dimensioner, nรฅr programmet kompileres, hvilket spilder plads, nรฅr der er behov for fรฆrre elementer, og fejler fuldstรฆndigt, nรฅr der er behov for flere. calloc() fjerner denne begrรฆnsning ved at reservere hukommelse under kรธrsel, og i modsรฆtning til malloc() nulstiller den hver byte, fรธr blokken returneres. Dette gรธr calloc() til det naturlige valg, nรฅr et program har brug for et rent, forudsigeligt hukommelsesomrรฅde til et array eller en struktur, hvis stรธrrelse kun er kendt, mens koden kรธrer.
Dynamisk allokering med calloc() passer til flere almindelige situationer:
- Numeriske arrays, der skal starte ved nul, sรฅsom tรฆllere, histogrammer eller lรธbende akkumulatorer.
- Datastrukturer hvor resterende affaldsvรฆrdier ville forรฅrsage subtile, vanskelige attracog insekter.
- Buffers hvis lรฆngde afhรฆnger af brugerinput eller en fil, der lรฆses, mens programmet kรธrer.
- Blokkene er for store til den begrรฆnsede stak, da calloc() trรฆkker fra den meget stรธrre heap.
Fordi den reserverede blok er sammenhรฆngende og allerede nulstillet, kan den straks behandles som et brugsklart array uden en separat initialiseringslรธkke.
calloc() Syntaks:
ptr = (cast_type *) calloc (n, size);
- Ovenstรฅende sรฆtningseksempel pรฅ calloc i C bruges til at allokere n hukommelsesblokke af samme stรธrrelse.
- Efter at hukommelsespladsen er allokeret, initialiseres alle bytes til nul.
- pointer som i รธjeblikket er ved den fรธrste byte af den tildelte hukommelsesplads, returneres.
Nรฅr der er en fejl ved tildeling af hukommelsesplads, sรฅsom mangel pรฅ hukommelse, returneres en nul-pointer som vist i nedenstรฅende calloc-eksempel.
Sรฅdan bruger du calloc
Nedenstรฅende calloc-program i C beregner summen af โโen aritmetisk sekvens.
#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; }
Resultat af calloc i C eksempel:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
Forskellen mellem calloc() og malloc()
calloc() og malloc() reserverer begge hukommelse pรฅ heapen og returnerer begge en void-pointer, eller NULL, ved fejl, men de adskiller sig pรฅ tre praktiske mรฅder, der afgรธr, hvilken en der skal bruges.
- Initialisering: calloc() sรฆtter hver byte i den nye blok til nul, mens malloc() lader indholdet vรฆre uinitialiseret, sรฅ en malloc()-blok indeholder uforudsigeligt affald, indtil programmet skriver til den.
- Argumenter: calloc() tager to argumenter, antallet af elementer og stรธrrelsen af โโhvert, skrevet calloc(n, size); malloc() tager et enkelt argument, det samlede antal bytes, skrevet malloc(n * size).
- Hastighed: malloc() er marginalt hurtigere, fordi den springer nulstillingstrinnet over, hvilket er grunden til, at kode, der รธjeblikkeligt overskriver hukommelsen, ofte foretrรฆkker den.
Begge funktioner erklรฆres i stdlib.h, og begge frigiver deres hukommelse med den samme free()-funktion. Vรฆlg calloc(), nรฅr en ren, nulstillet blok er vigtig, og malloc(), nรฅr rรฅ hastighed foretrรฆkkes, og programmet hรฅndterer initialiseringen selv.
Sรฅdan frigรธr du hukommelse allokeret af calloc()
Hukommelse reserveret af calloc() ligger pรฅ heapen og frigives aldrig automatisk. Nรฅr et program bliver ved med at allokere uden at frigรธre, forbruger det langsomt al tilgรฆngelig hukommelse, en defekt kendt som en hukommelseslรฆkage. Funktionen free() returnerer en fรฆrdig blok til systemet, sรฅ pladsen kan genbruges ved senere allokeringer.
Funktionen free() tager et enkelt argument, pointeren som calloc() returnerede, og frigiver hele blokken pรฅ รฉn gang:
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 */ }
Fรธlg disse regler for at administrere calloc()-hukommelse sikkert:
- Kald free() prรฆcis รฉn gang for hver vellykket calloc(); to gange frigivelse af den samme blok forรฅrsager udefineret adfรฆrd.
- Sรฆt markรธren til NULL efter frigรธrelse, sรฅ den ikke kan genbruges som en dinglende markรธr.
- Frigรธr aldrig () en pointer, som calloc() ikke returnerede, inklusive en, der er flyttet af pointer-aritmetik.
- Match hver allokering med en udgivelse, fรธr markรธren gรฅr uden for rรฆkkevidde.
Fordi calloc() og malloc() begge trรฆkker fra den samme heap, er frigรธrelsesdisciplinen identisk for begge funktioner: รฉn free() for hver vellykket allokering, og ingen adgang til blokken bagefter.ping Allokering og frigivelse i balance er den centrale vane ved manuel hukommelsesstyring i C, og det forhindrer bรฅde lรฆkager og nedbrud forรฅrsaget af genbrug af hukommelse, der allerede er returneret.
