Dynamisk minneallokering i C: malloc(), calloc()
โก Smart oppsummering
Dynamisk minneallokering i C reserverer og frigjรธr heap-minne under kjรธretid ved hjelp av funksjonene malloc(), calloc(), realloc() og free() fra stdlib.h-biblioteket, slik at programmer kan justere stรธrrelsen pรฅ arrayer og strukturer fleksibelt nรฅr kravene er ukjente fรธr utfรธrelse.

Hvordan fungerer minnebehandling i C?
Nรฅr du deklarerer en variabel ved hjelp av en grunnleggende datatype, tildeler C-kompilatoren automatisk minneplass for variabelen i et minnebasseng kalt stakken.
For eksempel tar en flyttallsvariabel vanligvis 4 byte (avhengig av plattformen) nรฅr den deklareres. Vi kan bekrefte denne informasjonen ved รฅ bruke sizeof-operatoren som vist i eksemplet nedenfor.
#include <stdio.h> int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Utgangen vil vรฆre:
The size of float is 4 bytes
Dessuten er en matrise med en spesifisert stรธrrelse tildelt i sammenhengende minneblokker, hver blokk har stรธrrelsen for ett element:
#include <stdio.h> int main() { float arr[10]; printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Resultatet er:
The size of the float array with 10 element is 40
Som vi har lรฆrt sรฅ langt, administreres minnet automatisk nรฅr man deklarerer en grunnleggende datatype eller en array. Det finnes imidlertid en prosess for รฅ allokere minne i C som lar deg implementere et program der arraystรธrrelsen er ubestemt fรธr du kjรธrer programmet (kjรธretidsmodus). Denne prosessen kalles ยซdynamisk minneallokeringยป.
Dynamisk minnetildeling i C
Dynamisk minneallokering er manuell tildeling og frigjรธring av minne i henhold til programmeringsbehovene dine. Dynamisk minne administreres og betjenes med pekere som peker til den nylig tildelte minneplassen i et omrรฅde som vi kaller heapen.
Nรฅ kan du opprette og รธdelegge en rekke elementer dynamisk under kjรธring uten problemer. For รฅ oppsummere bruker den automatiske minneadministrasjonen stabelen, og C Dynamic Memory Allocation bruker heapen.
De biblioteket har funksjoner som er ansvarlige for Dynamic Memory Management.
| Funksjon | Formรฅl |
|---|---|
| malloc () | Tildeler minnet med รธnsket stรธrrelse og returnerer pekeren til den fรธrste byten av tildelt plass. |
| calloc() | Tildeler plass for elementer i en matrise. Initialiserer elementene til null og returnerer en peker til minnet. |
| realloc() | Den brukes til รฅ endre stรธrrelsen pรฅ tidligere tildelt minneplass. |
| Gratis() | Frigjรธr eller tรธmmer tidligere tildelt minneplass. |
La oss diskutere funksjonene ovenfor med applikasjonen deres
malloc()-funksjonen i C
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 C malloc()-funksjonen til enhver peker.
Syntaks for malloc() funksjon:
ptr = (cast_type *) malloc (byte_size);
Her
- ptr er en peker av cast_type.
- C malloc()-funksjonen returnerer en peker til det tildelte minnet til byte_size.
Eksempel pรฅ malloc():
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:
#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 tildelte minnet er sammenhengende, og det kan behandles som en matrise. Vi kan bruke pekeraritmetikk for รฅ fรฅ tilgang til matriseelementene i stedet for รฅ bruke parenteser [ ]. Vi anbefaler รฅ bruke + for รฅ referere til matriseelementer fordi bruk av inkrementering ++ eller += endrer adressen lagret av pekeren.
Malloc()-funksjonen kan ogsรฅ brukes med karakterdatatypen sรฅ vel som komplekse datatyper som strukturer.
free() funksjon i C
Minnet for variabler blir automatisk deallokert pรฅ kompileringstidspunktet. Ved dynamisk minneallokering mรฅ du tildele minne eksplisitt. Hvis det ikke er gjort, kan det oppstรฅ en feil for tomt for minne.
Free()-funksjonen kalles for รฅ frigjรธre/avallokere minne i C. Ved รฅ frigjรธre minne i programmet ditt, gjรธr du mer tilgjengelig for senere bruk.
For eksempel:
#include <stdio.h> int main() { int* ptr = malloc(10 * sizeof(*ptr)); if (ptr != NULL){ *(ptr + 2) = 50; printf("Value of the 2nd integer is %d",*(ptr + 2)); } free(ptr); }
Utgang:
Value of the 2nd integer is 50
calloc() funksjon i C
C calloc()-funksjonen stรฅr for sammenhengende allokering. Denne funksjonen brukes til รฅ tildele flere minneblokker. Det er en dynamisk minneallokeringsfunksjon som brukes til รฅ allokere minnet til komplekse datastrukturer som matriser og strukturer.
Malloc()-funksjonen brukes til รฅ tildele en enkelt blokk med minneplass mens calloc() i C brukes til รฅ tildele flere blokker med minneplass. Hver blokk som tildeles av calloc()-funksjonen er av samme stรธrrelse.
Syntaks for calloc() funksjon:
ptr = (cast_type *) calloc (n, size);
Utsagnet ovenfor brukes til รฅ tildele n minneblokker av samme stรธrrelse.
Etter at minneplassen er tildelt, initialiseres alle byte til null.
Pekeren som for รธyeblikket befinner seg ved den fรธrste byte av den tildelte minneplassen returneres.
Hver gang det er en feil ved tildeling av minneplass, for eksempel mangel pรฅ minne, returneres en null-peker.
Eksempel pรฅ calloc():
Programmet nedenfor 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:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
calloc() vs. malloc(): Nรธkkelforskjeller
Fรธlgende er nรธkkelforskjellen mellom malloc() kontra calloc() i C:
Calloc()-funksjonen er generelt mer egnet og effektiv enn malloc()-funksjonen. Mens begge funksjonene brukes til รฅ tildele minneplass, kan calloc() tildele flere blokker pรฅ en gang. Du trenger ikke be om en minneblokk hver gang. Calloc()-funksjonen brukes i komplekse datastrukturer som krever stรธrre minneplass.
Minneblokken tildelt av en calloc() i C initialiseres alltid til null, mens den i funksjon malloc() i C alltid inneholder en sรธppelverdi.
realloc()-funksjonen i C
Ved รฅ bruke realloc()-funksjonen i C kan du legge til mer minnestรธrrelse til allerede allokert minne. Den utvider den gjeldende blokken mens det opprinnelige innholdet forblir som det er. realloc() i C stรฅr for reallokering av minne.
realloc() kan ogsรฅ brukes til รฅ redusere stรธrrelsen pรฅ det tidligere tildelte minnet.
Syntaks for realloc() funksjon:
ptr = realloc (ptr,newsize);
Utsagnet ovenfor tildeler en ny minneplass med en spesifisert stรธrrelse i variabelen nyhetsstรธrrelse. Etter รฅ ha utfรธrt funksjonen, vil pekeren bli returnert til den fรธrste byten i minneblokken. Den nye stรธrrelsen kan vรฆre stรธrre eller mindre enn det forrige minnet. Vi kan ikke vรฆre sikre pรฅ at hvis den nylig tildelte blokken vil peke til samme plassering som den forrige minneblokken. Denne funksjonen vil kopiere alle tidligere data i den nye regionen. Det sรธrger for at data forblir trygge.
Eksempel pรฅ realloc():
#include <stdio.h> int main () { char *ptr; ptr = (char *) malloc(10); strcpy(ptr, "Programming"); printf(" %s, Address = %u\n", ptr, ptr); ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new size strcat(ptr, " In 'C'"); printf(" %s, Address = %u\n", ptr, ptr); free(ptr); return 0; }
Hver gang realloc() i C resulterer i en mislykket operasjon, returnerer den en null-peker, og tidligere data frigjรธres ogsรฅ.
Dynamiske matriser i C
En dynamisk array i C lar antallet elementer vokse etter behov. C Dynamic array er mye brukt i datavitenskapelige algoritmer.
I det fรธlgende programmet har vi opprettet og endret stรธrrelsen pรฅ en dynamisk matrise i C
#include <stdio.h> int main() { int * arr_dynamic = NULL; int elements = 2, i; arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocks for (i = 0; i < elements; i++) arr_dynamic[i] = i; for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]); elements = 4; arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elements printf("After realloc\n"); for (i = 2; i < elements; i++) arr_dynamic[i] = i; for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]); free(arr_dynamic); }
Resultat av C Dynamic array-program pรฅ skjermen:
arr_dynamic[0]=0 arr_dynamic[1]=1 After realloc arr_dynamic[0]=0 arr_dynamic[1]=1 arr_dynamic[2]=2 arr_dynamic[3]=3

