Dynamische geheugentoewijzing in C: malloc (), calloc () Functies

Inhoudsopgave:

Anonim

Voordat u C Dynamic Memory-toewijzing leert, laten we het volgende begrijpen:

Hoe geheugenbeheer in C werkt?

Wanneer u een variabele declareert met behulp van een basisgegevenstype, wijst de C-compiler automatisch geheugenruimte toe aan de variabele in een geheugenpool die de stapel wordt genoemd .

Een float-variabele neemt bijvoorbeeld doorgaans 4 bytes in beslag (afhankelijk van het platform) wanneer deze wordt gedeclareerd. We kunnen deze informatie verifiëren met behulp van de operator sizeof , zoals weergegeven in het onderstaande voorbeeld

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

De output zal zijn:

 The size of float is 4 bytes 

Ook wordt een array met een gespecificeerde grootte toegewezen in aaneengesloten geheugenblokken, elk blok heeft de grootte voor één element:

#include int main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;} 

Het resultaat is:

 The size of the float array with 10 element is 40

Zoals tot dusver is geleerd, wordt het geheugen automatisch beheerd bij het declareren van een basisgegevenstype of een array. Er is echter een proces voor het toewijzen van geheugen in C waarmee u een programma kunt implementeren waarvan de grootte van de array onbeslist is totdat u uw programma uitvoert (runtime). Dit proces wordt " Dynamische geheugentoewijzing " genoemd.

In deze tutorial leer je-

  • Hoe geheugenbeheer in C werkt?
  • Dynamische geheugentoewijzing in C
  • C malloc () Functie
  • De free () functie
  • C calloc () Functie
  • calloc () vs. malloc (): belangrijkste verschillen
  • C realloc () Functie
  • Dynamische arrays

Dynamische geheugentoewijzing in C

Dynamische geheugentoewijzing is handmatige toewijzing en het vrijmaken van geheugen volgens uw programmeerbehoeften. Dynamisch geheugen wordt beheerd en bediend met verwijzingen die verwijzen naar de nieuw toegewezen geheugenruimte in een gebied dat we de heap noemen.

Nu kunt u zonder problemen een reeks elementen dynamisch tijdens runtime maken en vernietigen. Kortom, het automatische geheugenbeheer gebruikt de stapel en de C Dynamic Memory Allocation gebruikt de heap.

De bibliotheek heeft functies die verantwoordelijk zijn voor Dynamic Memory Management.

Functie Doel
malloc () Wijst het geheugen van de gevraagde grootte toe en retourneert de aanwijzer naar de eerste byte van de toegewezen ruimte.
calloc () Wijst de ruimte toe voor elementen van een array. Initialiseert de elementen op nul en retourneert een pointer naar het geheugen.
opnieuw toewijzen Het wordt gebruikt om de grootte van eerder toegewezen geheugenruimte te wijzigen.
Vrij() Maakt de eerder toegewezen geheugenruimte vrij of leeg.

Laten we de bovenstaande functies bespreken met hun toepassing

C malloc () Functie

De functie C malloc () staat voor geheugentoewijzing. Het is een functie die wordt gebruikt om een ​​geheugenblok dynamisch toe te wijzen. Het reserveert geheugenruimte met een gespecificeerde grootte en retourneert de nulwijzer die naar de geheugenlocatie wijst. De teruggezonden aanwijzer is meestal van het type void. Het betekent dat we de C malloc () -functie aan elke pointer kunnen toewijzen.

Syntaxis van malloc () Functie:

ptr = (cast_type *) malloc (byte_size);

Hier,

  • ptr is een pointer van cast_type.
  • De functie C malloc () retourneert een pointer naar het toegewezen geheugen van byte_size.

Voorbeeld van malloc ():

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

Als deze instructie met succes is uitgevoerd, wordt een geheugenruimte van 50 bytes gereserveerd. Het adres van de eerste byte van gereserveerde ruimte wordt toegewezen aan de pointer ptr van het type int.

Beschouw een ander voorbeeld:

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

Uitgang:

Value of the 6th integer is 480

  1. Merk op dat sizeof (* ptr) werd gebruikt in plaats van sizeof (int) om de code robuuster te maken wanneer * ptr-declaratie later naar een ander gegevenstype wordt getypt.
  2. De toewijzing kan mislukken als het geheugen niet voldoende is. In dit geval retourneert het een NULL-aanwijzer. U moet dus code opnemen om te controleren op een NULL-aanwijzer.
  3. Houd er rekening mee dat het toegewezen geheugen aaneengesloten is en als een array kan worden behandeld. We kunnen pointer-rekenkunde gebruiken om toegang te krijgen tot de array-elementen in plaats van haakjes [] te gebruiken. We raden aan om + te gebruiken om naar array-elementen te verwijzen, omdat het gebruik van incrementatie ++ of + = het adres dat door de pointer is opgeslagen, verandert.

De functie Malloc () kan ook worden gebruikt met het tekengegevenstype en met complexe gegevenstypen zoals structuren.

De free () functie

Het geheugen voor variabelen wordt automatisch ongedaan gemaakt tijdens het compileren. Bij dynamische geheugentoewijzing moet u de toewijzing van geheugen expliciet ongedaan maken. Als u dit niet doet, kan er een geheugenfout optreden.

De functie free () wordt aangeroepen om geheugen vrij te geven / de toewijzing ervan ongedaan te maken in C. Door geheugen vrij te maken in je programma, maak je meer beschikbaar voor later gebruik.

Bijvoorbeeld:

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

Uitvoer

 Value of the 2nd integer is 50

C calloc () Functie

De functie C calloc () staat voor aaneengesloten toewijzing. Deze functie wordt gebruikt om meerdere geheugenblokken toe te wijzen. Het is een dynamische geheugentoewijzingsfunctie die wordt gebruikt om het geheugen toe te wijzen aan complexe gegevensstructuren zoals arrays en structuren.

De functie Malloc () wordt gebruikt om een ​​enkel blok geheugenruimte toe te wijzen, terwijl de functie calloc () in C wordt gebruikt om meerdere blokken geheugenruimte toe te wijzen. Elk blok dat door de functie calloc () wordt toegewezen, heeft dezelfde grootte.

Syntaxis van calloc () Functie:

ptr = (cast_type *) calloc (n, size);
  • De bovenstaande instructie wordt gebruikt om n geheugenblokken van dezelfde grootte toe te wijzen.
  • Nadat de geheugenruimte is toegewezen, worden alle bytes op nul geïnitialiseerd.
  • De pointer die zich momenteel op de eerste byte van de toegewezen geheugenruimte bevindt, wordt geretourneerd.

Elke keer dat er een fout optreedt bij het toewijzen van geheugenruimte, zoals een tekort aan geheugen, wordt een nul-aanwijzer geretourneerd.

Voorbeeld van calloc ():

Het onderstaande programma berekent de som van een rekenkundige reeks.

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

Resultaat:

Building and calculating the sequence sum of the first 10 termsSum = 45

calloc () vs. malloc (): belangrijkste verschillen

Hieronder volgt het belangrijkste verschil tussen malloc () versus calloc () in C:

De functie calloc () is over het algemeen geschikter en efficiënter dan die van de functie malloc (). Hoewel beide functies worden gebruikt om geheugenruimte toe te wijzen, kan calloc () meerdere blokken tegelijk toewijzen. U hoeft niet elke keer een geheugenblok aan te vragen. De functie calloc () wordt gebruikt in complexe datastructuren die meer geheugenruimte vereisen.

Het geheugenblok dat is toegewezen door een calloc () in C wordt altijd op nul geïnitialiseerd, terwijl het in de functie malloc () in C altijd een afvalwaarde bevat.

C realloc () Functie

Met de functie C realloc () kunt u meer geheugenruimte toevoegen aan reeds toegewezen geheugen. Het breidt het huidige blok uit terwijl de originele inhoud ongewijzigd blijft. realloc () in C staat voor herverdeling van geheugen.

realloc () kan ook worden gebruikt om de grootte van het eerder toegewezen geheugen te verkleinen.

Syntaxis van realloc () Functie:

ptr = realloc (ptr,newsize);

De bovenstaande verklaring wijst een nieuwe geheugenruimte toe met een gespecificeerde grootte in de variabele newsize. Na het uitvoeren van de functie keert de pointer terug naar de eerste byte van het geheugenblok. Het nieuwe formaat kan groter of kleiner zijn dan het vorige geheugen. We kunnen er niet zeker van zijn of het nieuw toegewezen blok naar dezelfde locatie zal verwijzen als die van het vorige geheugenblok. Met deze functie worden alle eerdere gegevens naar de nieuwe regio gekopieerd. Het zorgt ervoor dat gegevens veilig blijven.

Voorbeeld van 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;} 

Telkens wanneer realloc () in C resulteert in een mislukte bewerking, retourneert het een null-aanwijzer en worden de vorige gegevens ook vrijgegeven.

Dynamische arrays in C.

Een dynamische array in C zorgt ervoor dat het aantal elementen naar behoefte kan groeien. C Dynamic array wordt veel gebruikt in computerwetenschappelijke algoritmen.

In het volgende programma hebben we een dynamische array in C gemaakt en de grootte ervan gewijzigd

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

Resultaat van C Dynamic array-programma op het scherm:

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

Overzicht

  • We kunnen het geheugen dynamisch beheren door zo nodig geheugenblokken in de heap te maken
  • Bij C Dynamic Memory Allocation wordt geheugen tijdens runtime toegewezen.
  • Dynamische geheugentoewijzing maakt het mogelijk strings en arrays te manipuleren waarvan de grootte flexibel is en op elk moment in uw programma kan worden gewijzigd.
  • Het is vereist als u geen idee heeft hoeveel geheugen een bepaalde structuur zal innemen.
  • Malloc () in C is een dynamische geheugentoewijzingsfunctie die staat voor geheugentoewijzing waarbij geheugenblokken met de specifieke grootte worden geïnitialiseerd op een afvalwaarde
  • Calloc () in C is een aaneengesloten geheugentoewijzingsfunctie die meerdere geheugenblokken tegelijk toewijst, geïnitialiseerd op 0
  • Realloc () in C wordt gebruikt om geheugen opnieuw toe te wijzen volgens de opgegeven grootte.
  • De functie Free () wordt gebruikt om het dynamisch toegewezen geheugen te wissen.