Wann calloc verwendet wird, um einen Speicherblock zuzuordnen, wird der zugewiesene Bereich mit Nullen initialisiert. Im Gegensatz, Malloc berührt nicht den Inhalt des zugewiesenen Speicherblocks, das heißt, er enthält Speicherwerte. Dies kann möglicherweise ein Sicherheitsrisiko darstellen, da der Speicherinhalt unvorhersehbar ist und Programmierfehler zu einem Verlust dieser Inhalte führen können.
calloc | Malloc | |
---|---|---|
Funktion | ordnet einen Speicherbereich zu, der groß genug ist, um jeweils "n Elemente" mit Bytes "Größe" aufzunehmen. Initialisiert auch den Speicherinhalt mit Nullen. | reserviert "size" Bytes des Speichers. |
Anzahl der Argumente | 2 | 1 |
Syntax | void * calloc (number_of_blocks, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Inhalt des zugewiesenen Speichers | Der zugewiesene Bereich wird auf Null initialisiert. | Der Inhalt des zugewiesenen Speichers wird nicht geändert. der Speicher enthält nicht vorhersagbare Werte oder Abfallwerte. Dies stellt ein Risiko dar. |
Rückgabewert | Leerzeiger (Leerzeichen *). Wenn die Zuordnung erfolgreich ist, wird ein Zeiger auf den Speicherblock zurückgegeben. Wenn die Zuweisung von Speicher fehlschlägt, wird ein NULL-Zeiger zurückgegeben. | Leerzeiger (Leerzeichen *). Wenn die Zuordnung erfolgreich ist, wird ein Zeiger auf den Speicherblock zurückgegeben. Wenn die Zuweisung von Speicher fehlschlägt, wird ein NULL-Zeiger zurückgegeben. |
void * malloc (size_t size);
ordnet zu Größe
Bytes Speicher Wenn die Zuordnung erfolgreich ist, wird ein Zeiger auf den zugewiesenen Speicher zurückgegeben. Andernfalls NULL
ist zurück gekommen. Beispiel:
/ * Weisen Sie Speicher für ein Array mit 15 Elementen des Typs zu int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Der Speicher konnte nicht zugewiesen werden. Drucken Sie daher einen Fehler und beenden Sie den Vorgang. * / fprintf (stderr, "Speicher konnte nicht zugewiesen werden \ n"); exit (EXIT_FAILURE); / * Zuteilung erfolgreich. * /
Beachten Sie, dass Malloc
erfordert, dass wir die Speicherbytes berechnen, die wir benötigen, und diese als Argument an malloc übergeben.
void * calloc (size_t nelements, size_t Bytes);
ordnet einen zusammenhängenden Speicherblock zu, der groß genug ist, um zu halten nelements
von der Größe Bytes
jeder. Der zugewiesene Bereich wird auf Null initialisiert. Im obigen Beispiel:
/ * Platz für ein Array mit 15 Elementen des Typs zuweisen int und zu Nullen initialisieren. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * Der Speicher konnte nicht zugewiesen werden. Drucken Sie daher einen Fehler und beenden Sie den Vorgang. * / fprintf (stderr, "Speicher konnte nicht zugewiesen werden \ n"); exit (EXIT_FAILURE); / * Zuteilung erfolgreich. * /
calloc (m, n) ist das gleiche wie
p = Malloc (m * n); if (p) Memset (p, 0, m * n);
In diesem Video-Lernprogramm werden Speicherzuordnungsfunktionen erläutert Malloc
, calloc
und Realloc
, sowie die Speicher-De-Allocation-Funktion kostenlos
:
Es ist im Allgemeinen eine gute Idee zu verwenden calloc
Über Malloc
. Wenn Sie Malloc verwenden, ist der Inhalt des zugewiesenen Speichers nicht vorhersagbar. Programmierfehler können dazu führen, dass diese Speicherinhalte auf unbeabsichtigte, aber höchst anfällige Weise verloren gehen. Ein gutes Beispiel für ein solches Leck ist die Heartbleed-Schwachstelle in OpenSSL, deren grundlegender Mechanismus in diesem XKCD-Comic erläutert wird. Weitere technische Details finden Sie in diesem Blogpost.
calloc ist ein bisschen langsamer als malloc, da der zugewiesene Speicherbereich extra initialisiert wird. In der Praxis ist der Geschwindigkeitsunterschied jedoch sehr gering und kann ignoriert werden.