std::calloc
| Definiert in Header <cstdlib> |
||
| void* calloc( std::size_t num, std::size_t size ); |
||
Allokiert Speicher für ein Array von num Objekten der Größe size und initialisiert ihn mit allen Bits null (implizites Erstellen von Objekten im Zielbereich).
Wenn die Allokation erfolgreich ist, wird ein Zeiger auf das niedrigste (erste) Byte des allokierten Speicherblocks zurückgegeben, das für jeden Objekttyp geeignet ausgerichtet ist.
Wenn size null ist, ist das Verhalten implementierungsdefiniert (ein Nullzeiger kann zurückgegeben werden, oder ein Zeiger, der nicht zur Speicheradressierung verwendet werden kann).
|
Die folgenden Funktionen sind Thread-sicher erforderlich
Aufrufe dieser Funktionen, die eine bestimmte Speichereinheit zuweisen oder freigeben, erfolgen in einer einzigen Gesamtordnung, und jeder solche Freigabeaufruf happens-before die nächste Zuweisung (falls vorhanden) in dieser Ordnung. |
(seit C++11) |
Inhalt |
[edit] Parameter
| num | - | Anzahl der Objekte |
| size | - | Größe jedes Objekts |
[edit] Rückgabewert
Bei Erfolg wird der Zeiger auf den Anfang des neu allokierten Speichers zurückgegeben. Um einen Speicherleck zu vermeiden, muss der zurückgegebene Zeiger mit std::free() oder std::realloc() freigegeben werden.
Bei einem Fehler wird ein Nullzeiger zurückgegeben.
[edit] Hinweise
Aufgrund der Ausrichtungsanforderungen ist die Anzahl der allokierten Bytes nicht notwendigerweise gleich num * size.
Die Initialisierung aller Bits auf null garantiert nicht, dass Gleitkommazahlen oder Zeiger mit 0,0 bzw. dem Nullzeigerwert initialisiert werden (obwohl dies auf allen gängigen Plattformen der Fall ist).
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 <cstdlib> #include <iostream> int main() { int* p1 = (int*)std::calloc(4, sizeof(int)); // allocate and zero out an array of 4 int int* p2 = (int*)std::calloc(1, sizeof(int[4])); // same, naming the array type directly int* p3 = (int*)std::calloc(4, sizeof *p3); // same, without repeating the type name if (p2) for (int n = 0; n < 4; ++n) // print the array std::cout << "p2[" << n << "] == " << p2[n] << '\n'; std::free(p1); std::free(p2); std::free(p3); }
Ausgabe
p2[0] == 0 p2[1] == 0 p2[2] == 0 p2[3] == 0
[edit] Siehe auch
| C-Dokumentation für calloc
|