Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

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

malloc vs calloc: Belangrijkste verschillen uitgelegd met praktische voorbeelden

Kenmerkmalloc()calloc()
Aantal parameters1 (grootte)2 (aantal, grootte)
Geheugentoestand na allocatieOngeïnitialiseerd (garbage)Nul-geïnitialiseerd
Typisch gebruikEnkel blok, handmatige initialisatieArrays of structuren die schone start nodig hebben
PrestatiesSneller (geen nul-stap)Langzamer (nul-overhead)
VeiligheidHoger risico op garbage-waardenLager risico door automatische nul
Retourwaarde bij falenNULLNULL
Standaard headerstdlib.hstdlib.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 NULL bij falen; controleer altijd voordat je dereferenceert.
  • Vergeet niet om toegewezen geheugen vrij te geven met free() om lekkages te voorkomen.

C Taal

  1. C# Expressies, Statements & Blokken: Uitgebreide Gids met Praktische Voorbeelden
  2. C++ do‑while Lus: Syntaxis, Praktische Voorbeelden en Geneste Lussen
  3. C++ Pointers Onder de Knie: Concepten, Voorbeelden & Praktische Toepassingen
  4. C++ Char Datatype: Declaratie, ASCII en Conversie‑Technieken
  5. C++ Operator Overloading – Praktische Handleiding met Code‑Voorbeelden
  6. C++ Functies Uitgelegd met Praktische Codevoorbeelden
  7. C# Collections Beheersen: Een Praktische Tutorial met Real-World Voorbeelden
  8. While vs. Do-While lussen: Duidelijke vergelijking met praktische voorbeelden
  9. calloc() in C: Nul-geïnitialiseerde geheugenallocatie en een praktisch voorbeeld
  10. Python's str.count() beheersen: Karakters & substrings tellen met voorbeelden
  11. Python round()-functie uitgelegd met praktische voorbeelden