Dynamisk hukommelsesallokering i C: funktioner i malloc (), calloc ()

Indholdsfortegnelse:

Anonim

Lad os forstå, før du lærer C Dynamic Memory-tildeling:

Hvordan fungerer Memory Management i C?

Når du erklærer en variabel ved hjælp af en grundlæggende datatype, tildeler C-compileren automatisk hukommelsesplads til variablen i en hukommelsespul kaldet stakken .

For eksempel tager en floatvariabel typisk 4 bytes (ifølge platformen), når den erklæres. Vi kan verificere disse oplysninger ved hjælp af størrelsen på operatøren som vist i nedenstående eksempel

#include int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}

Outputtet vil være:

 The size of float is 4 bytes 

Også en matrix med en specificeret størrelse tildeles i sammenhængende hukommelsesblokke, hver blok har størrelsen for et element:

#include 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 hidtil lært administreres hukommelsen automatisk, når deklarerer en grundlæggende datatype eller en matrix. Der er dog en proces til allokering af hukommelse i C, som giver dig mulighed for at implementere et program, hvor arraystørrelsen er uafklaret, indtil du kører dit program (runtime). Denne proces kaldes " Dynamisk hukommelsesallokering ."

I denne vejledning lærer du-

  • Hvordan fungerer Memory Management i C?
  • Dynamisk hukommelsesallokering i C
  • C malloc () funktion
  • Den gratis () funktion
  • C calloc () funktion
  • calloc () vs. malloc (): Nøgleforskelle
  • C realloc () funktion
  • Dynamiske arrays

Dynamisk hukommelsesallokering i C

Dynamisk hukommelsesallokering er manuel tildeling og frigørelse af hukommelse i henhold til dine programmeringsbehov. Dynamisk hukommelse styres og serveres med markører, der peger på det nyligt tildelte hukommelsesrum i et område, som vi kalder bunken.

Nu kan du oprette og ødelægge en række elementer dynamisk ved kørsel uden problemer. For at opsummere bruger den automatiske hukommelsesadministration stakken, og C Dynamic Memory Allocation bruger bunken.

biblioteket har funktioner, der er ansvarlige for Dynamic Memory Management.

Fungere Formål
malloc () Tildeler hukommelsen med den ønskede størrelse og returnerer markøren til den første byte af det tildelte rum.
calloc () Tildel plads til elementer i en matrix. Initialiserer elementerne til nul og returnerer en markør til hukommelsen.
realloc () Det bruges til at ændre størrelsen på tidligere tildelt hukommelsesplads.
Gratis() Frigør eller tømmer det tidligere tildelte hukommelsesrum.

Lad os diskutere ovenstående funktioner med deres anvendelse

C malloc () funktion

Funktionen C malloc () står for hukommelsestildeling. Det er en funktion, der bruges til at allokere en hukommelsesblok dynamisk. Den reserverer hukommelsesplads med den angivne størrelse og returnerer nulmarkøren, der peger på hukommelsesplaceringen. Den returnerede markør er normalt ugyldig. Det betyder, at vi kan tildele C malloc () -funktion til enhver markør.

Syntaks for malloc () Funktion:

ptr = (cast_type *) malloc (byte_size);

Her,

  • ptr er en markør af cast_type.
  • Funktionen C malloc () returnerer en markør til den tildelte hukommelse for byte_størrelse.

Eksempel på malloc ():

Example: ptr = (int *) malloc (50)

Når denne erklæring er eksekveret, reserveres et hukommelsesrum på 50 byte. Adressen til den første byte af reserveret plads tildeles markøren ptr af typen int.

Overvej et andet eksempel:

#include 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));}}

Produktion:

Value of the 6th integer is 480

  1. Bemærk, at sizeof (* ptr) blev brugt i stedet for sizeof (int) for at gøre koden mere robust, når * ptr-erklæringen senere udskrives til en anden datatype.
  2. Tildelingen kan mislykkes, hvis hukommelsen ikke er tilstrækkelig. I dette tilfælde returnerer den en NULL-markør. Så du skal medtage kode for at kontrollere, om der er en NULL-markør.
  3. Husk, at den tildelte hukommelse er sammenhængende, og at den kan behandles som en matrix. Vi kan bruge pegearitmetik til at få adgang til arrayelementerne i stedet for at bruge parenteser []. Vi anbefaler at bruge + til at henvise til matrixelementer, fordi brug af inkrementering ++ eller + = ændrer adressen gemt af markøren.

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

Den gratis () funktion

Hukommelsen for variabler deallokeres automatisk ved kompileringstidspunktet. I dynamisk hukommelsesallokering skal du eksplicit placere hukommelsen. Hvis det ikke er gjort, kan du støde på hukommelsesfejl.

Den gratis () funktion kaldes til at frigøre / deallocere hukommelse i C. Ved at frigøre hukommelse i dit program, gør du mere tilgængelig til brug senere.

For eksempel:

#include 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);}

Produktion

 Value of the 2nd integer is 50

C calloc () funktion

Funktionen C calloc () står for sammenhængende allokering. Denne funktion bruges til at allokere flere hukommelsesblokke. Det er en dynamisk hukommelsesallokeringsfunktion, der bruges til at allokere hukommelsen til komplekse datastrukturer såsom arrays og strukturer.

Malloc () -funktionen bruges til at allokere en enkelt hukommelsesblok, mens calloc () i C bruges til at allokere flere hukommelsesblokke. Hver blok tildelt af calloc () -funktionen har samme størrelse.

Syntaks for calloc () Funktion:

ptr = (cast_type *) calloc (n, size);
  • Ovenstående sætning bruges til at allokere n hukommelsesblokke af samme størrelse.
  • Når hukommelsespladsen er tildelt, initialiseres alle bytes til nul.
  • Markøren, der i øjeblikket er ved den første byte i det tildelte hukommelsesrum, returneres.

Når der er en fejl ved tildeling af hukommelsesplads, såsom mangel på hukommelse, returneres en nul-markør.

Eksempel på calloc ():

Programmet nedenfor beregner summen af ​​en aritmetisk sekvens.

#include 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 termsSum = 45

calloc () vs. malloc (): Nøgleforskelle

Følgende er nøgleforskellen mellem malloc () Vs calloc () i C:

Calloc () -funktionen er generelt mere passende og effektiv end malloc () -funktionen. Mens begge funktionerne bruges til at tildele hukommelsesplads, kan calloc () allokere flere blokke ad gangen. Du behøver ikke at anmode om en hukommelsesblok hver gang. Calloc () -funktionen bruges i komplekse datastrukturer, der kræver større hukommelsesplads.

Hukommelsesblokken allokeret af en calloc () i C initialiseres altid til nul, mens den i funktion malloc () i C altid indeholder en skraldværdi.

C realloc () funktion

Ved hjælp af C realloc () -funktionen kan du tilføje mere hukommelsesstørrelse til allerede tildelt hukommelse. Det udvider den aktuelle blok, mens det originale indhold efterlades, som det er. realloc () i C står for omfordeling af hukommelse.

realloc () kan også bruges til at reducere størrelsen på den tidligere tildelte hukommelse.

Syntaks for realloc () Funktion:

ptr = realloc (ptr,newsize);

Ovenstående erklæring tildeler et nyt hukommelsesrum med en specificeret størrelse i variablen nyhedsstørrelse. Efter udførelse af funktionen returneres markøren til den første byte i hukommelsesblokken. Den nye størrelse kan være større eller mindre end den forrige hukommelse. Vi kan ikke være sikre på, at hvis den nyligt tildelte blok peger på den samme placering som den forrige hukommelsesblok. Denne funktion kopierer alle tidligere data i den nye region. Det sørger for, at data forbliver sikre.

Eksempel på realloc ():

#include 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 sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;} 

Når realloc () i C resulterer i en mislykket operation, returnerer den en nul-markør, og de tidligere data frigøres også.

Dynamiske arrays i C

Et dynamisk array i C tillader, at antallet af elementer vokser efter behov. C Dynamisk array bruges i vid udstrækning i datalogiske algoritmer.

I det følgende program har vi oprettet og ændret størrelsen på et dynamisk array i C

#include int main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (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 elementsprintf("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 af C Dynamic array-program på skærmen:

arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3

Resumé

  • Vi kan styre hukommelsen dynamisk ved at oprette hukommelsesblokke efter behov i bunken
  • I C Dynamic Memory Allocation allokeres hukommelse på et kørselstidspunkt.
  • Dynamisk hukommelsesallokering tillader manipulation af strenge og arrays, hvis størrelse er fleksibel og kan ændres når som helst i dit program.
  • Det kræves, når du ikke har nogen idé om, hvor meget hukommelse en bestemt struktur vil besætte.
  • Malloc () i C er en dynamisk hukommelsesallokeringsfunktion, der står for hukommelsesallokering, der blokerer hukommelse med den specifikke størrelse initialiseret til en skraldværdi
  • Calloc () i C er en sammenhængende hukommelsesallokeringsfunktion, der tildeler flere hukommelsesblokke ad gangen initialiseret til 0
  • Realloc () i C bruges til at omfordele hukommelse i henhold til den specificerede størrelse.
  • Gratis () funktion bruges til at rydde den dynamisk tildelte hukommelse.