malloc()-funksjon i C-bibliotek med EKSEMPEL
โก Smart oppsummering
malloc() i C reserverer en minneblokk pรฅ heapen under kjรธretid og returnerer en void-peker til sin fรธrste byte, slik at programmer kan be om lagring hvis stรธrrelse er ukjent inntil koden faktisk kjรธres.
Hva er malloc i C?
Malloc()-funksjonen stรฅr for minneallokering. Det er en funksjon som brukes til รฅ tildele en minneblokk dynamisk. Den reserverer minneplass av spesifisert stรธrrelse og returnerer null-pekeren som peker til minneplasseringen. Pekeren som returneres er vanligvis av typen void. Det betyr at vi kan tilordne malloc-funksjon til enhver peker.
syntax
ptr = (cast_type *) malloc (byte_size);
Her
- ptr er en peker av cast_type.
- Malloc-funksjonen returnerer en peker til det tildelte minnet til byte_size.
Example: ptr = (int *) malloc (50)
Nรฅr denne setningen er utfรธrt, er en minneplass pรฅ 50 byte reservert. Adressen til den fรธrste byten med reservert plass er tilordnet pekeren ptr av typen int.
Tenk pรฅ et annet 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)); } }
Utgang:
Value of the 6th integer is 480
Legg merke til at sizeof(*ptr) ble brukt i stedet for sizeof(int) for รฅ gjรธre koden mer robust nรฅr *ptr-deklarasjonen senere typecastes til en annen datatype.
Tildelingen kan mislykkes hvis minnet ikke er tilstrekkelig. I dette tilfellet returnerer den en NULL-peker. Sรฅ du bรธr inkludere kode for รฅ se etter en NULL-peker.
Husk at det allokerte minnet er sammenhengende og kan behandles som en matrise. Vi kan bruke pekeren aritmetikk for รฅ fรฅ tilgang til arrayelementene i stedet for รฅ bruke parenteser []. Vi anbefaler รฅ bruke + for รฅ referere til arrayelementer fordi bruk av inkrementering ++ eller += endrer adressen som er lagret av pekeren.
Malloc-funksjonen kan ogsรฅ brukes med karakterdatatypen sรฅ vel som komplekse datatyper som strukturer.
Hvorfor bruke malloc() i C?
Statiske arrayer og vanlige variabler fikserer stรธrrelsen sin nรฅr programmet kompileres, noe som kaster bort plass nรฅr kravet viser seg รฅ vรฆre mindre og feiler fullstendig nรฅr det viser seg รฅ vรฆre stรธrre. malloc() lรธser dette ved รฅ be om minne under kjรธretid, slik at et program kan dimensjonere en buffer til den nรธyaktige mengden data det mottar. Denne fleksibiliteten under kjรธretid er kjernen i dynamisk minnetildeling i C.
Dynamisk allokering med malloc() er det riktige valget i flere vanlige situasjoner:
- Mengden input er ukjent fรธr programmet kjรธrer, for eksempel lesing av en fil eller en brukerlevert liste.
- Store blokker er nรธdvendige som ville overfylt den begrensede stakken, siden malloc() henter data fra den mye stรธrre heapen.
- Data mรฅ overleve funksjonen som opprettet dem, fordi heap-minnet vedvarer til det eksplisitt frigjรธres.
- Strukturer og arrayer mรฅ vokse eller krympe mens programmet kjรธrer.
Fordi den reserverte blokken leveres tilbake som en peker, kan den sendes billig mellom funksjoner uten รฅ kopiere de underliggende dataene.
Slik frigjรธr du minne allokert av malloc()
Minne reservert av malloc() 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 brukes pรฅ nytt.
Free()-funksjonen tar et enkelt argument, pekeren som malloc() returnerte, og frigir hele blokken samtidig:
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 reglene for รฅ administrere dynamisk minne pรฅ en sikker mรฅte:
- Kall free() nรธyaktig รฉn gang for hver vellykkede malloc(); รฅ 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 malloc() ikke returnerte, inkludert en som er forskjรธvet av pekeraritmetikk.
- Match hver tildeling med en samsvarende utgivelse fรธr pekeren gรฅr utenfor rekkevidde.
keeping Balansert allokering og frigjรธring er kjernedisiplinen innen manuell minnehรฅndtering i C, og det forhindrer bรฅde lekkasjer og krasj forรฅrsaket av gjenbruk av frigjort minne.
malloc() vs. calloc(): Viktige forskjeller
malloc() og calloc() begge reserverer heap-minne, men de er forskjellige i argumentene sine og i hvordan de behandler den nye blokken. malloc() tar ett argument, det totale antallet byte, og lar innholdet vรฆre uinitialisert, slik at blokken inneholder uforutsigbare sรธppelverdier inntil programmet skriver til den. calloc() tar to argumenter, antallet elementer og stรธrrelsen pรฅ hvert av dem, og sletter hver byte til null fรธr pekeren returneres.
De praktiske forskjellene kommer ned til tre punkter:
- Initialisering: calloc() nullstiller minnet, mens malloc() ikke gjรธr det, noe som gjรธr malloc() litt raskere nรฅr verdiene uansett skal overskrives.
- Argumenter: du skriver malloc(n * size) men calloc(n, size) for รฅ reservere samme array.
- Brukstilfelle: velg calloc() nรฅr en ren, nullstilt blokk er viktig, og malloc() nรฅr hastighet er foretrukket og initialisering hรฅndteres manuelt.
Begge funksjonene deklareres i stdlib.h, begge returnerer en void-peker eller NULL ved feil, og begge gir minnet tilbake med den samme free()-funksjonen.


