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.

  • ๐Ÿง  Nul-initialiseret hukommelse: calloc() nulstiller hver allokeret byte, i modsรฆtning til malloc(), som efterlader uforudsigelige affaldsvรฆrdier.
  • ๐Ÿ“ฆ To argumenter: calloc(n, size) reserverer n blokke af den givne stรธrrelse i รฉt sammenhรฆngende omrรฅde.
  • โš ๏ธ NULL-tjek: En mislykket allokering returnerer en NULL-pointer, sรฅ valider resultatet, fรธr du bruger det.
  • ๐Ÿ†š calloc vs. malloc: Vรฆlg calloc() for rene nulstillede arrays og malloc() nรฅr hastighed er vigtigere end initialisering.
  • ๐Ÿงน Frigรธr hukommelsen: Frigiv hver calloc()-blok med free() for at forhindre hukommelseslรฆkager.
  • ๐Ÿค– AI assistance: AI-assistenter og GitHub Copilot udkaster calloc()-kald og markerer manglende free()-sรฆtninger.

calloc()-funktion i C

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.

Ofte Stillede Spรธrgsmรฅl

calloc() er deklareret i standardbibliotekets header stdlib.h, sรฅ tilfรธj #include รธverst i kildefilen. Uden den kan compileren advare om en implicit deklaration og fejllรฆse den returnerede pointer.

Nรฅr heapen ikke kan opfylde anmodningen, returnerer calloc() en NULL-pointer i stedet for en gyldig adresse. Sammenlign altid resultatet med NULL, fรธr du bruger det, da dereferering af NULL forรฅrsager udefineret adfรฆrd og normalt fรฅr programmet til at gรฅ ned.

Ja. calloc() fungerer med alle typer, inklusive structs og arrays af structs, ved at overfรธre element count og sizeof(struct). Hvert medlem nulstilles, hvilket giver en ren starttilstand uden en manuel initialiseringslรธkke.

Ja. realloc() accepterer enhver pointer returneret af calloc() eller malloc() og forstรธrrer eller formindsker blokken, sรฅ eksisterende data bevares. Nye bytes tilfรธjet af realloc() nulstilles ikke, sรฅ initialiser dem selv om nรธdvendigt.

Resultatet er implementeringsdefineret: calloc() kan returnere NULL eller en unik pointer, der ikke kan derefereres, men som sikkert kan sendes til free(). Behandl begge resultater som "ingen brugbar hukommelse", og undgรฅ at lรฆse fra dem.

calloc() reserverer et sammenhรฆngende omrรฅde, der er stort nok til alle anmodede elementer, sรฅ de ligger ryg mod ryg som arrayceller. Navnet afspejler denne sammenhรฆngende, ryddede blok, der lader pointer-aritmetik trinvis gennemgรฅ hukommelsen pรฅlideligt.

Ja. AI-kodningsassistenter udarbejder calloc()-kald, tilfรธjer NULL-tjek og markerer manglende free()-kald eller lรฆkager, og de forklarer pointeraritmetik. Kompilรฉr og test altid den genererede kode, fรธr du stoler pรฅ den i produktion.

GitHub Copilot foreslรฅr calloc(), sizeof() og matchende free() linjer fra en kommentar, der beskriver din hensigt. RevSe hvert forslag til manglende NULL-tjek og lรฆkager, fรธr du kompilerer.

Opsummer dette indlรฆg med: