calloc()-funksjon i C-bibliotek med programeksempel

⚡ Smart oppsummering

calloc() i C reserverer flere sammenhengende minneblokker på heapen og initialiserer hver byte til null, og returnerer en void-peker som lar programmer lage rene, bruksklare arrayer og datastrukturer under kjøretid.

  • 🧠 Nullinitialisert minne: calloc() sletter hver tildelte byte til null, i motsetning til malloc() som etterlater uforutsigbare søppelverdier.
  • 📦 To argumenter: calloc(n, size) reserverer n blokker av den gitte størrelsen i ett sammenhengende område.
  • ⚠️ NULL-sjekk: En mislykket allokering returnerer en NULL-peker, så valider resultatet før du bruker det.
  • 🆚 calloc vs. malloc: Velg calloc() for rene nullstillingsmatriser og malloc() når hastighet er viktigere enn initialisering.
  • 🧹 Frigjør minnet: Frigjør hver calloc()-blokk med free() for å forhindre minnelekkasjer.
  • 🤖 AI-hjelp: AI-assistenter og GitHub Copilot utkaster calloc()-kall og flagger manglende free()-setninger.

calloc()-funksjon i C

Hva er calloc i C?

calloc() i C er en funksjon som brukes til å allokere flere minneblokker av samme størrelse. Det er en dynamisk minneallokeringsfunksjon som allokerer minneplass til komplekse datastrukturer som arrayer og strukturer, og returnerer en tomromspeker til minnet. Calloc står for sammenhengende allokering.

Malloc funksjon brukes til å tildele en enkelt blokk med minneplass mens calloc-funksjonen i C brukes til å tildele flere blokker med minneplass. Hver blokk tildelt av calloc i C-programmering er av samme størrelse.

Hvorfor bruke calloc() i C?

Vanlige variabler og arrayer med fast størrelse låser dimensjonene sine når programmet kompileres, noe som sløser med plass når færre elementer er nødvendig, og feiler fullstendig når flere er nødvendig. calloc() fjerner denne grensen ved å reservere minne under kjøretid, og i motsetning til malloc() tømmer den hver byte til null før blokken leveres tilbake. Dette gjør calloc() til det naturlige valget når et program trenger et rent, forutsigbart minneområde for en array eller struktur hvis størrelse bare er kjent mens koden kjører.

Dynamisk allokering med calloc() passer til flere vanlige situasjoner:

  • Numeriske matriser som skal starte på null, for eksempel tellere, histogrammer eller løpende akkumulatorer.
  • Datastrukturer der gjenværende søppelverdier ville forårsake subtile, vanskelig åtracog insekter.
  • Buffers hvis lengde avhenger av brukerinndata eller en fil som leses mens programmet kjører.
  • Blokkene er for store for den begrensede stakken, siden calloc() henter fra den mye større heapen.

Fordi den reserverte blokken er sammenhengende og allerede nullstilt, kan den behandles umiddelbart som en bruksklar array uten en separat initialiseringsløkke.

calloc() syntaks:

ptr = (cast_type *) calloc (n, size);
  • Eksemplet ovenfor på calloc i C brukes til å tildele n minneblokker av samme størrelse.
  • Etter at minneplassen er tildelt, initialiseres alle byte til null.
  • Ocuco pekeren som for øyeblikket er på den første byten av den tildelte minneplassen, returneres.

Når det er en feil ved allokering av minneplass, for eksempel mangel på minne, returneres en null-peker som vist i calloc-eksemplet nedenfor.

Hvordan bruke calloc

Calloc-programmet nedenfor i C beregner summen av 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 av calloc i C-eksempel:

 
Building and calculating the sequence sum of the first 10 terms
Sum = 45

Forskjellen mellom calloc() og malloc()

calloc() og malloc() reserverer begge minne på heapen og returnerer begge en void-peker, eller NULL ved feil, men de er forskjellige på tre praktiske måter som avgjør hvilken som skal brukes.

  • Initialisering: calloc() setter hver byte i den nye blokken til null, mens malloc() lar innholdet være uinitialisert, slik at en malloc()-blokk inneholder uforutsigbart søppel inntil programmet skriver til den.
  • Argumenter: calloc() tar to argumenter, antall elementer og størrelsen på hvert, skrevet calloc(n, størrelse); malloc() tar et enkelt argument, det totale antallet byte, skrevet malloc(n * størrelse).
  • Hastighet: malloc() er marginalt raskere fordi den hopper over nullstillingstrinnet, og det er derfor kode som umiddelbart overskriver minnet ofte foretrekker det.

Begge funksjonene deklareres i stdlib.h, og begge frigjør minnet sitt med den samme free()-funksjonen. Velg calloc() når en ren, nullstilt blokk er viktig, og malloc() når rå hastighet er foretrukket og programmet håndterer initialiseringen selv.

Slik frigjør du minne allokert av calloc()

Minne reservert av calloc() ligger på heapen og frigjøres aldri automatisk. Når et program fortsetter å allokere uten å frigjøre, forbruker det sakte alt tilgjengelig minne, en feil kjent som en minnelekkasje. Free()-funksjonen returnerer en ferdig blokk til systemet slik at plassen kan gjenbrukes ved senere allokeringer.

Free()-funksjonen tar et enkelt argument, pekeren som calloc() returnerte, og frigir hele blokken samtidig:

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 reglene for å administrere calloc()-minne på en sikker måte:

  • Kall free() nøyaktig én gang for hver vellykkede calloc(); å frigjøre den samme blokken to ganger forårsaker udefinert oppførsel.
  • Sett pekeren til NULL etter frigjøring, slik at den ikke kan brukes om igjen som en dinglende peker.
  • Aldri frigjør() en peker som calloc() ikke returnerte, inkludert en som er flyttet av pekeraritmetikk.
  • Match hver tildeling med en utgivelse før pekeren går utenfor omfanget.

Fordi calloc() og malloc() begge henter fra samme heap, er frigjøringsdisiplinen identisk for begge funksjonene: én free() for hver vellykket allokering, og ingen tilgang til blokken etterpå.ping Balanse mellom allokering og frigjøring er kjernevanen ved manuell minnehåndtering i C, og det forhindrer både lekkasjer og krasj forårsaket av gjenbruk av minne som allerede er returnert.

Spørsmål og svar

calloc() er deklarert i standardbibliotekets header stdlib.h, så legg til #include øverst i kildefilen. Uten den kan kompilatoren advare om en implisitt deklarasjon og feillese den returnerte pekeren.

Når heapen ikke kan oppfylle forespørselen, returnerer calloc() en NULL-peker i stedet for en gyldig adresse. Sammenlign alltid resultatet med NULL før du bruker det, fordi dereferering av NULL forårsaker udefinert oppførsel og vanligvis krasjer programmet.

Ja. calloc() fungerer med alle typer, inkludert strukturer og arrayer av strukturer, ved å sende elementtellingen og sizeof(struct). Hvert medlem nullstilles, noe som gir en ren starttilstand uten en manuell initialiseringsløkke.

Ja. realloc() aksepterer enhver peker returnert av calloc() eller malloc() og forstørrer eller krymper blokken, samtidig som eksisterende data bevares. Nye byte lagt til av realloc() blir ikke nullstilt, så initialiser dem selv om nødvendig.

Resultatet er implementeringsdefinert: calloc() kan returnere NULL eller en unik peker som ikke kan derefereres, men som trygt kan sendes til free(). Behandle begge resultatene som «intet brukbart minne» og unngå å lese fra det.

calloc() reserverer ett sammenhengende område som er stort nok for alle forespurte elementer, slik at de ligger rygg mot rygg som arrayceller. Navnet gjenspeiler denne sammenhengende, ryddede blokken, som lar pekeraritmetikk gå pålitelig gjennom minnet.

Ja. AI-kodingsassistenter utarbeider calloc()-kall, legger til NULL-sjekker og flagger manglende free()-kall eller lekkasjer, og de forklarer pekeraritmetikk. Kompiler og test alltid den genererte koden før du stoler på den i produksjon.

GitHub Copilot foreslår calloc(), sizeof() og matchende free()-linjer fra en kommentar som beskriver intensjonen din. RevSe hvert forslag for manglende NULL-sjekker og lekkasjer før du kompilerer.

Oppsummer dette innlegget med: