Malloc en Free
Deze functies stellen ons in staat om nieuwe objecten te creëren niet tijdens de compilatie, maar tijdens de uitvoering van het programma, waardoor we gebruik kunnen maken van dynamische geheugenallocatie.
malloc()
Voorheen, om geheugen toe te wijzen voor onze data, declareerden we eenvoudigweg:
int x;
Nu kunnen we met de functie malloc() geheugen dynamisch toewijzen:
int* pX = (int*)malloc(4);
De functie malloc() vereist het aantal bytes dat moet worden toegewezen als argument. Als je niet zeker weet hoeveel bytes nodig zijn, maar wel het type data kent dat moet worden opgeslagen, kun je de expressie als volgt aanpassen:
int* pX = (int*)malloc(sizeof(int));
Wat gebeurt er vervolgens?
Let op dat we het resultaat van de functie malloc() toewijzen aan een pointer. Dit betekent dat malloc() een adres retourneert!
Het voorvoegsel (int*) is een expliciete cast. We geven handmatig het gewenste type op. Bijvoorbeeld:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Opmerking
Vergeet niet het headerbestand
stdlib.htoe te voegen. Dit bevat de prototype voor de functiemalloc().
Om gegevens op te slaan op het adres dat door de functie malloc() wordt geleverd, gebruiken we de dereferentie-operator.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Is het mogelijk om geheugen vrij te maken? – Ja, maar alleen het geheugen dat is toegewezen door malloc() en vergelijkbare functies.
free()
Deze functie wordt gebruikt met pointers. Ter illustratie breiden we het bovenstaande voorbeeld uit:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Interessant genoeg blijft een pointer zelfs nadat we deze "verwijderen" functioneel, maar de waarde die is opgeslagen op de bijbehorende geheugenlocatie wordt onbetrouwbaar.
Dit leidt tot een probleem: een bezette geheugencel bevat nu onbetrouwbare gegevens. Om deze pointers te voorkomen, moet de gebruikte pointer worden gereset naar NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Een pointer op NULL zetten nadat het geheugen is vrijgegeven, is een duidelijke manier om aan te geven dat de pointer niet langer naar een geldige geheugenlocatie verwijst.
Controleer altijd of de pointer NULL is voordat deze wordt gebruikt, om te waarborgen dat er geen toegang is tot ongeldige of reeds toegewezen geheugen.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Awesome!
Completion rate improved to 2.63
Malloc en Free
Veeg om het menu te tonen
Deze functies stellen ons in staat om nieuwe objecten te creëren niet tijdens de compilatie, maar tijdens de uitvoering van het programma, waardoor we gebruik kunnen maken van dynamische geheugenallocatie.
malloc()
Voorheen, om geheugen toe te wijzen voor onze data, declareerden we eenvoudigweg:
int x;
Nu kunnen we met de functie malloc() geheugen dynamisch toewijzen:
int* pX = (int*)malloc(4);
De functie malloc() vereist het aantal bytes dat moet worden toegewezen als argument. Als je niet zeker weet hoeveel bytes nodig zijn, maar wel het type data kent dat moet worden opgeslagen, kun je de expressie als volgt aanpassen:
int* pX = (int*)malloc(sizeof(int));
Wat gebeurt er vervolgens?
Let op dat we het resultaat van de functie malloc() toewijzen aan een pointer. Dit betekent dat malloc() een adres retourneert!
Het voorvoegsel (int*) is een expliciete cast. We geven handmatig het gewenste type op. Bijvoorbeeld:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Opmerking
Vergeet niet het headerbestand
stdlib.htoe te voegen. Dit bevat de prototype voor de functiemalloc().
Om gegevens op te slaan op het adres dat door de functie malloc() wordt geleverd, gebruiken we de dereferentie-operator.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Is het mogelijk om geheugen vrij te maken? – Ja, maar alleen het geheugen dat is toegewezen door malloc() en vergelijkbare functies.
free()
Deze functie wordt gebruikt met pointers. Ter illustratie breiden we het bovenstaande voorbeeld uit:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Interessant genoeg blijft een pointer zelfs nadat we deze "verwijderen" functioneel, maar de waarde die is opgeslagen op de bijbehorende geheugenlocatie wordt onbetrouwbaar.
Dit leidt tot een probleem: een bezette geheugencel bevat nu onbetrouwbare gegevens. Om deze pointers te voorkomen, moet de gebruikte pointer worden gereset naar NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Een pointer op NULL zetten nadat het geheugen is vrijgegeven, is een duidelijke manier om aan te geven dat de pointer niet langer naar een geldige geheugenlocatie verwijst.
Controleer altijd of de pointer NULL is voordat deze wordt gebruikt, om te waarborgen dat er geen toegang is tot ongeldige of reeds toegewezen geheugen.
Bedankt voor je feedback!