Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Malloc en Free | Pointers
C-Basis

bookMalloc 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

Main.c

copy
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.h toe te voegen. Dit bevat de prototype voor de functie malloc().

Om gegevens op te slaan op het adres dat door de functie malloc() wordt geleverd, gebruiken we de dereferentie-operator.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 6. Hoofdstuk 4

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 2.63

bookMalloc 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

Main.c

copy
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.h toe te voegen. Dit bevat de prototype voor de functie malloc().

Om gegevens op te slaan op het adres dat door de functie malloc() wordt geleverd, gebruiken we de dereferentie-operator.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 6. Hoofdstuk 4
some-alt