calloc
| Definiert im Header <stdlib.h> |
||
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).
|
Ein vorheriger Aufruf von free, free_sized und free_aligned_sized(seit C23) oder realloc, der einen Speicherbereich freigibt, synchronisiert mit einem Aufruf von |
(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
|