CALLOC vs. Malloc
- 3406
- 840
- Fr. Fine Zschunke
Wenn CALLOC wird verwendet, um einen Speicherblock zuzuweisen, der zugewiesene Bereich wird in Nullen initialisiert. Im Gegensatz, Malloc berührt nicht den Inhalt des zugewiesenen Speicherblocks, was bedeutet, dass er Müllwerte enthält. Dies könnte möglicherweise ein Sicherheitsrisiko sein, da der Speicherinhalt unvorhersehbar ist und Programmierfehler zu einem Leck dieser Inhalte führen können.
Vergleichstabelle
Unterschiede - Ähnlichkeiten -CALLOC | Malloc | |
---|---|---|
Funktion | verteilt einen Speicherbereich, der groß genug ist, um "n Elemente" von "Größe" -Bytes zu halten. Initialisiert auch Inhalt des Speichers zu Nullen. | Zuteilt "Größe" 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 | Die zugewiesene Region wird auf Null initialisiert. | Der Inhalt des zugewiesenen Speichers wird nicht geändert. ich.e., Das Gedächtnis enthält unvorhersehbare oder Müllwerte. Dies ist ein Risiko. |
Rückgabewert | Hohlzeiger (void *). Wenn die Zuweisung erfolgreich ist, wird ein Zeiger auf den Speicherblock zurückgegeben. Wenn die Speicherallokation fehlschlägt, wird ein Nullzeiger zurückgegeben. | Hohlzeiger (void *). Wenn die Zuweisung erfolgreich ist, wird ein Zeiger auf den Speicherblock zurückgegeben. Wenn die Speicherallokation fehlschlägt, wird ein Nullzeiger zurückgegeben. |
Syntax und Beispiele
malloc ()
void *malloc (size_t size);
zu Größe
Bytes des Gedächtnisses. Wenn die Zuordnung erfolgreich ist, wird ein Zeiger auf den zugewiesenen Speicher zurückgegeben. Ansonsten NULL
ist zurück gekommen. Beispiel:
/* Speicher Speicher für ein Array mit 15 Typelementen vom Typ zuweisen int. */ int *ptr = malloc (15 *sizeof (int)); if (ptr == null) /* Speicher kann nicht zugewiesen werden. Drucken Sie also einen Fehler und beenden Sie beenden. */ fprintf (stderr, "konnte nicht das Gedächtnis \ n"); exit (exit_failure); /* Zuweisung erfolgreich. */
Beachten Sie, dass Malloc
erfordert, dass wir die von uns benötigten Speicher Bytes berechnen, und diese als Argument an Malloc übergeben.
CALLOC ()
void *CALLOC (size_t nelements, size_t bytes);
verteilt einen zusammenhängenden Speicherblock, der groß genug ist, um zu halten Nelemente
von Größe Bytes
jede. Die zugewiesene Region wird auf Null initialisiert. Im obigen Beispiel:
/* Platz für ein Array mit 15 Elementen vom Typ zuweisen int und initialisieren zu Nullen. */ int *ptr = CALLOC (15, sizeof (int)); if (ptr == null) /* Speicher kann nicht zugewiesen werden. Drucken Sie also einen Fehler und beenden Sie beenden. */ fprintf (stderr, "konnte nicht das Gedächtnis \ n"); exit (exit_failure); /* Zuweisung erfolgreich. */
CALLOC (M, N) ist der gleiche wie
p = malloc (m * n); if (p) memset (p, 0, m * n);
Video zur Erklärung von Calloc, Malloc und Realloc
In diesem Video -Tutorial werden Speicherzuweisungsfunktionen erläutert Malloc
, CALLOC
Und Realloc
, sowie die Speicher-De-Adlokation-Funktion frei
:
Sicherheitsüberlegungen
Es ist im Allgemeinen eine gute Idee zu verwenden CALLOC
über Malloc
. Wenn Sie Malloc verwenden, ist der Inhalt des zugewiesenen Speichers unvorhersehbar. Programmierfehler können dazu führen, dass diese Speicherinhalte auf unbeabsichtigte, aber sehr gefährdete Weise auslaufen. Ein gutes Beispiel für ein solches Leck ist die Heartbleed -Verwundbarkeit in OpenSSL, deren Grundmechanismus in diesem XKCD -Comic erklärt wird, und einige weitere technische Details finden Sie in diesem Blog -Beitrag.
Ausführungsgeschwindigkeit
CALLOC ist ein bisschen langsamer als Malloc, da der zusätzliche Schritt der zugewiesenen Speicherregion initialisiert wird. In der Praxis ist der Geschwindigkeitsunterschied jedoch sehr klein und kann ignoriert werden.