C Dynamische geheugentoewijzing
C Dynamische geheugentoewijzing
In deze zelfstudie leert u om dynamisch geheugen in uw C-programma toe te wijzen met behulp van standaard bibliotheekfuncties:malloc(), calloc(), free() en realloc().
Zoals je 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 hebt aangegeven onvoldoende. Om dit probleem op te lossen, kunt u tijdens runtime handmatig geheugen toewijzen. Dit staat bekend als dynamische geheugentoewijzing in C-programmering.
Om geheugen dynamisch toe te wijzen, zijn de bibliotheekfuncties malloc()
, calloc()
, realloc()
en free()
worden gebruikt. Deze functies zijn gedefinieerd in de <stdlib.h>
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 pointer van void
die kan worden gegoten in pointers van elke vorm.
Syntaxis van malloc()
ptr = (castType*) malloc(size);
Voorbeeld
ptr = (float*) malloc(100 * sizeof(float));
De bovenstaande verklaring wijst 400 bytes geheugen toe. Het is omdat de grootte van float
is 4 bytes. En de aanwijzer ptr bevat het adres van de eerste byte in het toegewezen geheugen.
De uitdrukking resulteert in een NULL
aanwijzer als het geheugen niet kan worden toegewezen.
C calloc()
De naam "calloc" staat voor aaneengesloten toewijzing.
De malloc()
functie wijst geheugen toe en laat het geheugen niet geïnitialiseerd, terwijl de calloc()
functie wijst geheugen toe en initialiseert alle bits op nul.
Syntaxis van calloc()
ptr = (castType*)calloc(n, size);
Voorbeeld:
ptr = (float*) calloc(25, sizeof(float));
De bovenstaande verklaring wijst aaneengesloten ruimte in het geheugen toe voor 25 elementen van het type float
.
C gratis()
Dynamisch toegewezen geheugen gemaakt met ofwel calloc()
of malloc()
komt niet vanzelf vrij. Je moet expliciet free()
. gebruiken om de spatie vrij te maken.
Syntaxis van free()
free(ptr);
Deze verklaring maakt de ruimte vrij die is toegewezen in het geheugen dat wordt aangeduid door ptr
.
Voorbeeld 1:malloc() en free()
// Program to calculate the sum of n numbers entered by the user
#include <stdio.h>
#include <stdlib.h>
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;
}
Uitvoer
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
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 <stdio.h>
#include <stdlib.h>
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;
}
Uitvoer
Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156
C realloc()
Als het dynamisch toegewezen geheugen onvoldoende of meer is dan vereist, kunt u de grootte van eerder toegewezen geheugen wijzigen met behulp van de realloc()
functie.
Syntaxis van realloc()
ptr = realloc(ptr, x);
Hier, ptr wordt opnieuw toegewezen met een nieuwe maat x .
Voorbeeld 3:realloc()
#include <stdio.h>
#include <stdlib.h>
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:\n");
for(i = 0; i < n1; ++i)
printf("%pc\n",ptr + i);
printf("\nEnter the new size: ");
scanf("%d", &n2);
// rellocating the memory
ptr = realloc(ptr, n2 * sizeof(int));
printf("Addresses of newly allocated memory:\n");
for(i = 0; i < n2; ++i)
printf("%pc\n", ptr + i);
free(ptr);
return 0;
}
Uitvoer
Enter size: 2 Addresses of previously allocated memory: 26855472 26855476 Enter the new size: 4 Addresses of newly allocated memory: 26855472 26855476 26855480 26855484
C Taal
- Alleen-lezen geheugen (ROM)
- Microprocessors
- C++ Geheugenbeheer:nieuw en verwijderen
- Cervoz upgradet DDR4-2666-geheugen van de volgende generatie
- C++ Dynamische toewijzing van arrays met voorbeeld
- calloc() Functie in C-bibliotheek met programma VOORBEELD
- realloc() Functie in C Library:Hoe te gebruiken? Syntaxis en voorbeeld
- C - Geheugenbeheer
- Dynamische prijzen in traditionele winkels zijn onvermijdelijk
- C++ dynamisch geheugen
- Java 10 - Heaptoewijzing