Namensräume
Varianten
Aktionen

calloc

Von cppreference.com
< c‎ | memory
Definiert im Header <stdlib.h>
void* calloc( size_t num, size_t size );

Allokiert Speicher für ein Array von num Objekten der Größe size und initialisiert alle Bytes im zugewiesenen Speicher mit Null.

Wenn die Allokation erfolgreich ist, wird ein Zeiger auf das niedrigste (erste) Byte im zugewiesenen Speicherblock zurückgegeben, das für jeden Objekttyp mit fundamentaler Ausrichtung geeignet ausgerichtet ist.

Wenn size Null ist, ist das Verhalten implementierungsdefiniert (ein Nullzeiger kann zurückgegeben werden, oder es kann ein Nicht-Null-Zeiger zurückgegeben werden, der nicht zum Zugriff auf Speicher verwendet werden darf).

calloc ist threadsicher: Es verhält sich so, als ob nur die über sein Argument sichtbaren Speicherorte zugegriffen werden und nicht auf statischen Speicher.

Ein vorheriger Aufruf von free, free_sized und free_aligned_sized(seit C23) oder realloc, der einen Speicherbereich freigibt, synchronisiert mit einem Aufruf von calloc, der denselben oder einen Teil desselben Speicherbereichs allokiert. Diese Synchronisation erfolgt nach jedem Zugriff auf den Speicher durch die Freigabefunktion und vor jedem Zugriff auf den Speicher durch calloc. Es gibt eine einzige Gesamtordnung aller Allokations- und Freigabefunktionen, die auf einen bestimmten Speicherbereich wirken.

(seit C11)

Inhalt

[edit] Parameter

num - Anzahl der Objekte
size - Größe jedes Objekts

[edit] Rückgabewert

Bei Erfolg wird ein Zeiger auf den Anfang des neu allokierten Speichers zurückgegeben. Um einen Speicherleck zu vermeiden, muss der zurückgegebene Zeiger mit free() oder realloc() freigegeben werden.

Bei einem Fehler wird ein Nullzeiger zurückgegeben.

[edit] Anmerkungen

Aufgrund der Ausrichtungsanforderungen ist die Anzahl der allokierten Bytes nicht unbedingt gleich num * size.

Die Initialisierung aller Bits auf Null garantiert nicht, dass ein Gleitkommawert oder ein Zeiger mit 0.0 bzw. dem Nullzeigerwert initialisiert wird (obwohl dies auf allen gängigen Plattformen zutrifft).

Ursprünglich (in C89) wurde die Unterstützung für null Größe hinzugefügt, um Code wie z.B. zu ermöglichen

OBJ* p = calloc(0, sizeof(OBJ)); // "zero-length" placeholder
...
while(1)
{
    p = realloc(p, c * sizeof(OBJ)); // reallocations until size settles
    ... // code that may change c or break out of loop
}

[edit] Beispiel

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int* p1 = calloc(4, sizeof(int));    // allocate and zero out an array of 4 int
    int* p2 = calloc(1, sizeof(int[4])); // same, naming the array type directly
    int* p3 = calloc(4, sizeof *p3);     // same, without repeating the type name
 
    if (p2)
    {
        for (int n = 0; n < 4; ++n) // print the array
            printf("p2[%d] == %d\n", n, p2[n]);
    }
 
    free(p1);
    free(p2);
    free(p3);
}

Ausgabe

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

[edit] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.22.3.2 Die Funktion calloc (p: TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.22.3.2 Die Funktion calloc (p: 253)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.22.3.2 Die Funktion calloc (p: 348)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.20.3.1 Die Funktion calloc (p: 313)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.10.3.1 Die Funktion calloc

[edit] Siehe auch

C++ Dokumentation für calloc