CALLOC vs. Malloc

CALLOC vs. Malloc

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 gegen malloc -Vergleichstabelle
CALLOCMalloc
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.