Dynamisch Geheugenbeheer in C: calloc, malloc en free uitgelegd
Dit hoofdstuk legt dynamisch geheugenbeheer in C uit. De C-programmeertaal biedt verschillende functies voor geheugentoewijzing en -beheer. Deze functies zijn te vinden in het <stdlib.h> header-bestand.
| Nr. | Functie & Beschrijving |
|---|---|
| 1 | void *calloc(int num, int size); Deze functie allokeert een array van num elementen waarvan elk de grootte in bytes size is. |
| 2 | void free(void *address); Deze functie geeft een blok geheugen vrij gespecificeerd door adres. |
| 3 | void *malloc(size_t size); Deze functie allokeert een array van num bytes en laat ze geïnitialiseerd. |
| 4 | void *realloc(void *address, int newsize); Deze functie herallokeert geheugen uitbreidend tot newsize. |
Dynamisch Geheugen Toewijzen
Tijdens het programmeren, als je de grootte van een array kent, dan is het eenvoudig en kun je het definiëren als een array. Bijvoorbeeld, om de naam van een persoon op te slaan, kan het maximaal 100 karakters zijn, dus kun je definiëren als volgt:
char naam[100];
Maar nu laten we een situatie overwegen waar je geen idee hebt over de lengte van de tekst die je moet opslaan, bijvoorbeeld, je wilt een gedetailleerde beschrijving over een onderwerp opslaan. Hier moeten we een pointer naar character definiëren zonder te definiëren hoeveel geheugen nodig is en later, op basis van de vereiste, kunnen we geheugen toewijzen zoals getoond in het onderstaande voorbeeld:
Live Demo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char naam[100];
char *beschrijving;
strcpy(naam, "Zara Ali");
/* geheugen dynamisch toewijzen */
beschrijving = malloc( 200 * sizeof(char) );
if( beschrijving == NULL ) {
fprintf(stderr, "Fout - kan vereist geheugen niet toewijzen\n");
} else {
strcpy( beschrijving, "Zara ali een DPS student in klas 10");
}
printf("Naam = %s\n", naam );
printf("Beschrijving: %s\n", beschrijving );
}
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, produceert het het volgende resultaat.
Naam = Zara Ali Beschrijving: Zara ali een DPS student in klas 10
Hetzelfde programma kan geschreven worden met calloc(); het enige is dat je malloc moet vervangen door calloc als volgt:
calloc(200, sizeof(char));
Dus je hebt volledige controle en je kunt elke grootte waarde doorgeven tijdens het toewijzen van geheugen, in tegenstelling tot arrays waar eenmaal de grootte gedefinieerd, je het niet kunt wijzigen.
Geheugen Herformaten en Vrijgeven
Wanneer je programma afsluit, geeft het besturingssysteem automatisch al het door je programma toegewezen geheugen vrij, maar als goede praktijk, wanneer je geen geheugen meer nodig hebt, moet je dat geheugen vrijgeven door de functie free() aan te roepen.
Alternatief kun je de grootte van een toegewezen geheugenblok vergroten of verkleinen door de functie realloc() aan te roepen. Laten we het bovenstaande programma nog eens bekijken en gebruikmaken van realloc() en free() functies:
Live Demo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char naam[100];
char *beschrijving;
strcpy(naam, "Zara Ali");
/* geheugen dynamisch toewijzen */
beschrijving = malloc( 30 * sizeof(char) );
if( beschrijving == NULL ) {
fprintf(stderr, "Fout - kan vereist geheugen niet toewijzen\n");
} else {
strcpy( beschrijving, "Zara ali een DPS student.");
}
/* stel je wilt een grotere beschrijving opslaan */
beschrijving = realloc( beschrijving, 100 * sizeof(char) );
if( beschrijving == NULL ) {
fprintf(stderr, "Fout - kan vereist geheugen niet toewijzen\n");
} else {
strcat( beschrijving, "Zij zit in klas 10");
}
printf("Naam = %s\n", naam );
printf("Beschrijving: %s\n", beschrijving );
/* geheugen vrijgeven met free() functie */
free(beschrijving);
}
Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, produceert het het volgende resultaat.
Naam = Zara Ali Beschrijving: Zara ali een DPS student.Zij zit in klas 10
Je kunt het bovenstaande voorbeeld proberen zonder extra geheugen te herallokeren, en de strcat() functie zal een fout geven vanwege gebrek aan beschikbaar geheugen in beschrijving.
C Taal
- Niet-mechanische digitale geheugens begrijpen: SRAM, DRAM en Flash
- ROM, PROM, EPROM en EEPROM begrijpen: ontwerp, programmeren en identificatie
- Microprocessoren: de evolutie van stored-program computing
- Asset Management Evenementen 2012: Top Conferenties, Training & Tentoonstellingen
- 4 Sleuteldoelstellingen voor Effectief Asset Management
- Het Definitieve Handboek voor Onderhoudsmanagement: Een Praktische Gids voor Leiders
- C++ Geheugenbeheer meesteren: Expert gebruik van new en delete
- Dynamische geheugentoewijzing in C: malloc, calloc, realloc en free onder de knie krijgen
- C++ Dynamisch Geheugen Beheersen: Stack vs. Heap Uitgelegd
- Java-documentatiecommentaar: Javadoc en commentaartypes beheersen
- Java 10: Heap toewijzen op NV-DIMM met -XX:AllocateHeapAt