C Dynamische geheugentoewijzing met behulp van malloc (), calloc (), free () & realloc ()

In deze tutorial leer je hoe je dynamisch geheugen in je C-programma kunt toewijzen met behulp van standaard bibliotheekfuncties: malloc (), calloc (), free () en realloc ().

Zoals u weet, is een array een verzameling van een vast aantal waarden. Zodra de grootte van een array is gedeclareerd, kunt u deze niet meer wijzigen.

Soms is de grootte van de array die u heeft opgegeven mogelijk onvoldoende. Om dit probleem op te lossen, kunt u tijdens runtime handmatig geheugen toewijzen. Dit staat bekend als dynamische geheugentoewijzing in C-programmering.

Geheugen dynamisch toewijzen bibliotheek functies malloc(), calloc(), realloc()en free()worden gebruikt. Deze functies zijn gedefinieerd in het header-bestand.

C malloc ()

De naam "malloc" staat voor geheugentoewijzing.

De malloc()functie reserveert een blok geheugen van het opgegeven aantal bytes. En het retourneert een aanwijzer voiddie kan worden gegoten in aanwijzers van elke vorm.

Syntaxis van malloc ()

 ptr = (castType*) malloc(size);

Voorbeeld

 ptr = (float*) malloc(100 * sizeof(float));

De bovenstaande instructie wijst 400 bytes geheugen toe. Het is omdat de grootte van float4 bytes is. En de pointer ptr bevat het adres van de eerste byte in het toegewezen geheugen.

De uitdrukking resulteert in een NULLpointer als het geheugen niet kan worden toegewezen.

C calloc ()

De naam "calloc" staat voor aaneengesloten allocatie.

De malloc()functie wijst geheugen toe en laat het geheugen niet geïnitialiseerd. Terwijl de calloc()functie geheugen toewijst en alle bits op nul initialiseert.

Syntaxis van calloc ()

 ptr = (castType*)calloc(n, size);

Voorbeeld:

 ptr = (float*) calloc(25, sizeof(float));

De bovenstaande instructie wijst aaneengesloten ruimte in het geheugen toe voor 25 elementen van het type float.

C gratis ()

Dynamisch toegewezen geheugen gemaakt met een van beide calloc()of malloc()komt niet vanzelf vrij. U moet expliciet gebruiken free()om de spatie vrij te geven.

Syntaxis van gratis ()

 free(ptr);

Deze instructie maakt de ruimte vrij die is toegewezen in het geheugen waarnaar wordt verwezen ptr.

Voorbeeld 1: malloc () en gratis ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Hier hebben we het geheugen dynamisch toegewezen voor n aantal int.

Voorbeeld 2: calloc () en free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C opnieuw toewijzen ()

Als het dynamisch toegewezen geheugen onvoldoende of meer is dan vereist, kunt u de grootte van het eerder toegewezen geheugen met de realloc()functie wijzigen.

Syntaxis van realloc ()

 ptr = realloc(ptr, x);

Hier wordt ptr opnieuw toegewezen met een nieuwe maat x.

Voorbeeld 3: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Wanneer u het programma uitvoert, is de uitvoer:

 Voer grootte in: 2 adressen van eerder toegewezen geheugen: 26855472 26855476 Voer de nieuwe grootte in: 4 adressen van nieuw toegewezen geheugen: 26855472 26855476 26855480 26855484

Interessante artikelen...