malloc() Funktion i C-bibliotek med EKSEMPEL

⚡ Smart opsummering

malloc() i C reserverer en blok hukommelse på heapen under kørsel og returnerer en void-pointer til dens første byte, hvilket lader programmer anmode om lagerplads, hvis størrelse er ukendt, indtil koden rent faktisk udføres.

  • 🧠 Runtime-allokering: malloc() reserverer hukommelse under udførelse, når den nødvendige størrelse ikke er kendt på kompileringstidspunktet.
  • 📦 Syntaks: En cast_type-pointer modtager malloc(byte_size), almindeligvis dimensioneret med sizeof for portabilitet.
  • ⚠️ NULL-tjek: En mislykket anmodning returnerer en NULL-pointer, så valider resultatet, før du derefererer det.
  • Pointer-aritmetik: Blokken er sammenhængende, så brug + i stedet for ++ for at nå array-elementer.
  • 🧹 Frigør hukommelsen: Frigiv hver blok med free() for at forhindre hukommelseslækager og dinglende pointere.
  • 🤖 AI assistance: AI-assistenter og GitHub Copilot udkaster malloc()-kald og markerer manglende free()-sætninger.

malloc()-funktion i C

Hvad er malloc i C?

Malloc()-funktionen står for hukommelsesallokering. Det er en funktion, som bruges til at allokere en hukommelsesblok dynamisk. Den reserverer hukommelsesplads af specificeret størrelse og returnerer nul-markøren, der peger på hukommelsesplaceringen. Den returnerede markør er normalt af typen void. Det betyder, at vi kan tildele malloc-funktion til enhver pointer.

Hvad er malloc i C

Syntaks

ptr = (cast_type *) malloc (byte_size);

Her,

  • ptr er en pointer af cast_type.
  • Malloc-funktionen returnerer en pointer til den tildelte hukommelse af byte_size.
Example: ptr = (int *) malloc (50)

Når denne sætning er udført, er der reserveret en hukommelsesplads på 50 bytes. Adressen på den første byte af reserveret plads er tildelt til pointeren ptr af typen int.

Overvej et andet eksempel på malloc-implementering:

#include <stdlib.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */
    if (ptr != NULL) {
      *(ptr + 5) = 480; /* assign 480 to sixth integer */
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

Output:

Value of the 6th integer is 480

Bemærk at sizeof(*ptr) blev brugt i stedet for sizeof(int) for at gøre koden mere robust, når *ptr-deklarationen senere typecastes til en anden datatype.

Tildelingen kan mislykkes, hvis hukommelsen ikke er tilstrækkelig. I dette tilfælde returnerer den en NULL-markør. Så du bør inkludere kode for at tjekke for en NULL-pointer.

Husk at den allokerede hukommelse er sammenhængende og kan behandles som et array. Vi kan bruge pointer aritmetik for at få adgang til array-elementerne i stedet for at bruge parenteser []. Vi anbefaler at bruge + til at referere til array-elementer, fordi brug af inkrementering ++ eller += ændrer den adresse, der er gemt af pointeren.

Malloc-funktionen kan også bruges med karakterdatatypen såvel som komplekse datatyper såsom strukturer.

Hvorfor bruge malloc() i C?

Statiske arrays og almindelige variabler fastsætter deres størrelse, når programmet kompileres, hvilket spilder plads, når kravet viser sig at være mindre, og fejler fuldstændigt, når det viser sig at være større. malloc() løser dette ved at anmode om hukommelse under kørsel, så et program kan tilpasse størrelsen på en buffer til den præcise mængde data, det modtager. Denne fleksibilitet under kørsel er kernen i dynamisk hukommelsesallokering i C.

Dynamisk allokering med malloc() er det rigtige valg i flere almindelige situationer:

  • Mængden af ​​input er ukendt, før programmet kører, f.eks. læsning af en fil eller en brugerleveret liste.
  • Der er behov for store blokke, der ville overfylde den begrænsede stak, da malloc() trækker fra den meget større heap.
  • Data skal overleve den funktion, der skabte dem, fordi heap-hukommelsen fortsætter, indtil den eksplicit frigives.
  • Strukturer og arrays skal vokse eller krympe, mens programmet kører.

Fordi den reserverede blok returneres som en pointer, kan den billigt overføres mellem funktioner uden at kopiere de underliggende data.

Sådan frigør du hukommelse allokeret af malloc()

Hukommelse reserveret af malloc() 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.

Funktionen free() tager et enkelt argument, pointeren som malloc() returnerede, og frigiver hele blokken på én gang:

int *ptr;
ptr = malloc(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 dynamisk hukommelse sikkert:

  • Kald free() præcis én gang for hver vellykket malloc(); frigivelse af den samme blok to gange 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 malloc() ikke returnerede, inklusive en pointer, der er flyttet af pointeraritmetik.
  • Match hver allokering med en matchende udgivelse, før markøren går uden for rækkevidde.

keeping Balanceret allokering og frigivelse er kernedisciplinen i manuel hukommelsesstyring i C, og det forhindrer både lækager og nedbrud forårsaget af genbrug af frigjort hukommelse.

malloc() vs. calloc(): Vigtigste forskelle

malloc() og calloc() begge reserverer heap-hukommelse, men de adskiller sig i deres argumenter og i hvordan de behandler den nye blok. malloc() tager ét argument, det samlede antal bytes, og lader indholdet være uinitialiseret, så blokken indeholder uforudsigelige garbage-værdier, indtil programmet skriver til den. calloc() tager to argumenter, antallet af elementer og størrelsen af ​​hvert, og nulstiller hver byte, før pointeren returneres.

De praktiske forskelle kan nedbringes til tre punkter:

  • Initialisering: calloc() nulstiller hukommelsen, mens malloc() ikke gør det, hvilket gør malloc() en smule hurtigere, når værdierne alligevel overskrives.
  • Argumenter: du skriver malloc(n * size) men calloc(n, size) for at reservere det samme array.
  • Brugsscenario: Vælg calloc() når en ren, nulstillet blok er vigtig, og malloc() når hastighed foretrækkes, og initialisering håndteres manuelt.

Begge funktioner erklæres i stdlib.h, begge returnerer en void-pointer eller NULL ved fejl, og begge giver deres hukommelse tilbage med den samme free()-funktion.

Ofte Stillede Spørgsmål

I C er konverteringen valgfri og frarådes ofte, fordi void* automatisk konverterer til enhver objektpointer, og en eksplicit konvertering kan maskere en manglende stdlib.h include. C++, men rollebesætningen er påkrævet.

En NULL-retur betyder, at anmodningen mislykkedes, normalt på grund af utilstrækkelig hukommelse. Kontroller altid pointeren, før du bruger den, da dereferering af NULL fører til udefineret adfærd og typisk får programmet til at gå ned.

realloc() ændrer størrelsen på en blok, der tidligere er reserveret af malloc(), keeping eksisterende data op til den mindre størrelse. Hvis den fejler, returnerer den NULL og lader den oprindelige blok være intakt, så tildel først dens resultat til en midlertidig pointer.

En hukommelseslækage opstår, når heap-hukommelse fra malloc() aldrig frigives med free(). Programmet bliver ved med at reservere plads, det ikke længere bruger, hvilket gradvist kan opbruge den tilgængelige hukommelse.

malloc() reserverer hukommelse på heapen, ikke stakken. Heapblokke forbliver gyldige, indtil du kalder free(), så de kan overleve den funktion, der oprettede dem, i modsætning til automatiske stakvariabler, der forsvinder ved returnering.

malloc() er en biblioteksfunktion, der returnerer void* og skal bruge sizeof for at beregne bytes. C++ new er en operator, der returnerer en typebestemt pointer og kalder konstruktører. Par malloc() med free(), og new med delete.

Ja. AI-kodningsassistenter udarbejder malloc()-kald, indsætter NULL-tjek og markerer manglende free()-kald eller lækager, og de kan forklare pointeraritmetik. Kompilér og test altid den genererede kode, før du stoler på den.

GitHub Copilot foreslår malloc(), 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: