std:: calloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<cstdlib>
|
||
|
void
*
calloc
(
std::
size_t
num,
std::
size_t
size
)
;
|
||
Reserviert Speicher für ein Array von num Objekten der Größe size , initialisiert diesen mit allen Bits auf Null ( implizit erzeugende Objekte im Zielbereich).
Wenn die Allokierung erfolgreich ist, gibt sie einen Zeiger auf das niedrigste (erste) Byte im allokierten Speicherblock zurück, das für jeden Objekttyp geeignet ausgerichtet ist.
Wenn size null ist, ist das Verhalten implementierungsdefiniert (es kann ein Nullzeiger zurückgegeben werden, oder es kann ein Nicht-Null-Zeiger zurückgegeben werden, der möglicherweise nicht für den Zugriff auf Speicher verwendet werden darf).
|
Die folgenden Funktionen müssen thread-sicher sein:
Aufrufe dieser Funktionen, die eine bestimmte Speichereinheit allozieren oder deallozieren, erfolgen in einer einzigen Gesamtordnung, und jeder solche Deallokationsaufruf happens-before der nächsten Allokation (falls vorhanden) in dieser Ordnung. |
(seit C++11) |
Inhaltsverzeichnis |
Parameter
| num | - | Anzahl der Objekte |
| size | - | Größe jedes Objekts |
Rückgabewert
Bei Erfolg gibt die Funktion einen Zeiger auf den Anfang des neu allokierten Speichers zurück. Um einen Speicherverlust zu vermeiden, muss der zurückgegebene Zeiger mit std::free() oder std::realloc() freigegeben werden.
Bei Fehler wird ein Nullzeiger zurückgegeben.
Hinweise
Aufgrund der Ausrichtungsanforderungen entspricht die Anzahl der zugewiesenen Bytes nicht notwendigerweise num * size .
Die Initialisierung auf alle Bits Null garantiert nicht, dass ein Gleitkommawert oder ein Zeiger jeweils auf 0.0 bzw. den 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 folgenden zu ermöglichen:
OBJ *p = calloc(0, sizeof(OBJ)); // "Null-Längen"-Platzhalter ... while (1) { p = realloc(p, c * sizeof(OBJ)); // Neuzuweisungen bis Größe sich stabilisiert ... // Code, der c ändern oder Schleife abbrechen kann }
Beispiel
#include <cstdlib> #include <iostream> int main() { int* p1 = (int*)std::calloc(4, sizeof(int)); // allokiere und setze ein Array von 4 int auf Null int* p2 = (int*)std::calloc(1, sizeof(int[4])); // dasselbe, mit direktem Typnamen des Arrays int* p3 = (int*)std::calloc(4, sizeof *p3); // dasselbe, ohne Wiederholung des Typnamens if (p2) for (int n = 0; n < 4; ++n) // gebe das Array aus 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
Siehe auch
|
C-Dokumentation
für
calloc
|