Calloc vs. Malloc

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.

Vergleichstabelle

Calloc vs. Malloc Vergleichstabelle
callocMalloc
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.

Inhalt: Calloc vs. Malloc

  • 1 Syntax und Beispiele
    • 1.1 malloc ()
    • 1.2 calloc ()
  • 2 Video, das Calloc, Malloc und Realloc erläutert
  • 3 Sicherheitsaspekte
  • 4 Ausführungsgeschwindigkeit
  • 5 Referenzen

Syntax und Beispiele

Malloc ()

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.

calloc ()

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); 

Video, das Calloc, Malloc und Realloc erläutert

In diesem Video-Lernprogramm werden Speicherzuordnungsfunktionen erläutert Malloc, calloc und Realloc, sowie die Speicher-De-Allocation-Funktion kostenlos:

Sicherheitsüberlegungen

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.

Geschwindigkeit der Ausführung

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.

Verweise

  • calloc Man Seite
  • Malloc Man Seite