malloc vs calloc: Belangrijkste verschillen uitgelegd met praktische voorbeelden
Wat is dynamische geheugenallocatie?
Dynamische geheugenallocatie laat een programma geheugen aanvragen en vrijgeven tijdens runtime. In C biedt de standaardbibliotheek vier primaire functies hiervoor – malloc(), calloc(), realloc(), en free() – allemaal gedeclareerd in stdlib.h.
malloc(): Alloceer een enkel geheugenblok
malloc() (kort voor "memory allocation") reserveert een aaneengesloten blok bytes en retourneert een pointer naar de eerste byte. De inhoud van het nieuw toegewezen blok is onbepaald, wat betekent dat ze de bits bevatten die toevallig op die locatie in het geheugen stonden.
Typisch gebruik:
int *p = (int *)malloc(n * sizeof(int));Als de aanvraag mislukt, retourneert
malloc() NULL.
calloc(): Alloceer meerdere nul-geïnitialiseerde blokken
calloc() (kort voor "contiguous allocation") neemt twee argumenten: het aantal elementen en de grootte van elk element. Het alloceert geheugen voor alle elementen en stelt automatisch elke byte in op nul, wat het ideaal maakt voor arrays of structuren die een schone starttoestand nodig hebben.
Typisch gebruik:
int *p = (int *)calloc(n, sizeof(int));Net als
malloc(), retourneert het NULL als de allocatie mislukt.
Wanneer welke functie gebruiken
- malloc() – Gebruik wanneer je een enkel blok nodig hebt en je het geheugen zelf wilt initialiseren. Het is iets sneller omdat het de nul-stap overslaat.
- calloc() – Gebruik wanneer je een array of structuur nodig hebt die met alle nullen moet beginnen. De automatische initialisatie beschermt tegen per ongeluk gebruik van garbage-waarden.
Syntaxis overzicht
malloc()
void *malloc(size_t size);
calloc()
void *calloc(size_t num, size_t size);
Praktische codevoorbeelden
Voorbeeld 1: malloc() gebruiken om 15 integers op te slaan
#include <stdlib.h> #include <stdio.h> int main(void) { int *ptr = malloc(15 * sizeof(*ptr)); if (!ptr) { perror("malloc failed"); return EXIT_FAILURE; } ptr[5] = 480; // 6e element (0-based index) printf("Value of the 6th integer is %d\n", ptr[5]); free(ptr); return EXIT_SUCCESS; }
Output: Value of the 6th integer is 480
Voorbeeld 2: calloc() gebruiken om een som te berekenen
#include <stdlib.h> #include <stdio.h> int main(void) { int *ptr = calloc(10, sizeof(int)); if (!ptr) { perror("calloc failed"); return EXIT_FAILURE; } int sum = 0; for (int i = 0; i < 10; ++i) { ptr[i] = i; // initialisatie is redundant maar getoond voor duidelijkheid sum += ptr[i]; } printf("Sum = %d\n", sum); free(ptr); return EXIT_SUCCESS; }
Output: Sum = 45
Zij-aan-zij vergelijking
| Kenmerk | malloc() | calloc() |
|---|---|---|
| Aantal parameters | 1 (grootte) | 2 (aantal, grootte) |
| Geheugentoestand na allocatie | Ongeïnitialiseerd (garbage) | Nul-geïnitialiseerd |
| Typisch gebruik | Enkel blok, handmatige initialisatie | Arrays of structuren die schone start nodig hebben |
| Prestaties | Sneller (geen nul-stap) | Langzamer (nul-overhead) |
| Veiligheid | Hoger risico op garbage-waarden | Lager risico door automatische nul |
| Retourwaarde bij falen | NULL | NULL |
| Standaard header | stdlib.h | stdlib.h |
Conclusie
- Gebruik
malloc()wanneer je een enkel blok nodig hebt en het zelf initialiseert voor een kleine prestatiewinst. - Gebruik
calloc()wanneer je nul-geïnitialiseerd geheugen vereist, vooral voor arrays of structs, om subtiele bugs te vermijden. - Beide functies retourneren
NULLbij falen; controleer altijd voordat je dereferenceert. - Vergeet niet om toegewezen geheugen vrij te geven met
free()om lekkages te voorkomen.
C Taal
- C# Expressies, Statements & Blokken: Uitgebreide Gids met Praktische Voorbeelden
- C++ do‑while Lus: Syntaxis, Praktische Voorbeelden en Geneste Lussen
- C++ Pointers Onder de Knie: Concepten, Voorbeelden & Praktische Toepassingen
- C++ Char Datatype: Declaratie, ASCII en Conversie‑Technieken
- C++ Operator Overloading – Praktische Handleiding met Code‑Voorbeelden
- C++ Functies Uitgelegd met Praktische Codevoorbeelden
- C# Collections Beheersen: Een Praktische Tutorial met Real-World Voorbeelden
- While vs. Do-While lussen: Duidelijke vergelijking met praktische voorbeelden
- calloc() in C: Nul-geïnitialiseerde geheugenallocatie en een praktisch voorbeeld
- Python's str.count() beheersen: Karakters & substrings tellen met voorbeelden
- Python round()-functie uitgelegd met praktische voorbeelden