Die Funktionen malloc() Und calloc() sind Bibliotheksfunktionen, die Speicher dynamisch zuweisen. Dynamisch bedeutet, dass der Speicher während der Laufzeit (Ausführung des Programms) aus dem Heap-Segment zugewiesen wird.
Initialisierung
malloc() reserviert einen Speicherblock mit einer bestimmten Größe (in Bytes) und gibt einen Zeiger auf den Anfang des Blocks zurück. malloc() initialisiert den zugewiesenen Speicher nicht. Wenn Sie versuchen, aus dem zugewiesenen Speicher zu lesen, ohne ihn zuerst zu initialisieren, rufen Sie undefiniertes Verhalten hervor, was normalerweise bedeutet, dass die von Ihnen gelesenen Werte Müllwerte sind.
Excel-Datei in Java lesen
calloc() reserviert den Speicher und initialisiert außerdem jedes Byte im zugewiesenen Speicher auf 0. Wenn Sie versuchen, den Wert des zugewiesenen Speichers zu lesen, ohne ihn zu initialisieren, erhalten Sie 0, da er bereits von calloc() auf 0 initialisiert wurde.
Parameter
malloc() benötigt ein einzelnes Argument, nämlich das Anzahl der zuzuordnenden Bytes.
Im Gegensatz zu malloc() benötigt calloc() zwei Argumente:
- Anzahl der zuzuordnenden Blöcke.
- Größe jedes Blocks in Bytes.
Rückgabewert
Nach erfolgreicher Zuweisung in malloc() und calloc() wird ein Zeiger auf den Speicherblock zurückgegeben, andernfalls wird NULL zurückgegeben, was auf einen Fehler hinweist.
Beispiel
Der folgende C-Code demonstriert den Unterschied zwischen malloc- und calloc-Funktionen zur Zuweisung von dynamischem Speicher.
C
// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> >// Both of these allocate the same number of bytes,> >// which is the amount of bytes that is required to> >// store 5 int values.> >// The memory allocated by calloc will be> >// zero-initialized, but the memory allocated with> >// malloc will be uninitialized so reading it would be> >// undefined behavior.> >int>* allocated_with_malloc =>malloc>(5 *>sizeof>(>int>));> >int>* allocated_with_calloc =>calloc>(5,>sizeof>(>int>));> >// As you can see, all of the values are initialized to> >// zero.> >printf>(>'Values of allocated_with_calloc: '>);> >for> (>size_t> i = 0; i <5; ++i) {> >printf>(>'%d '>, allocated_with_calloc[i]);> >}> >putchar>(>'
'>);> >// This malloc requests 1 terabyte of dynamic memory,> >// which is unavailable in this case, and so the> >// allocation fails and returns NULL.> >int>* failed_malloc =>malloc>(1000000000000);> >if> (failed_malloc == NULL) {> >printf>(>'The allocation failed, the value of '> >'failed_malloc is: %p'>,> >(>void>*)failed_malloc);> >}> >// Remember to always free dynamically allocated memory.> >free>(allocated_with_malloc);> >free>(allocated_with_calloc);> }> |
>
>Ausgabe
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Unterschied zwischen malloc() und calloc() in C
Sehen wir uns die Unterschiede in tabellarischer Form an:
| Ja Nein. | malloc() Bild als Hintergrund in CSS | calloc() |
|---|---|---|
| 1. | malloc() ist eine Funktion, die einen Speicherblock mit fester Größe erstellt. | calloc() ist eine Funktion, die einer einzelnen Variablen eine bestimmte Anzahl von Speicherblöcken zuweist. |
| 2. | malloc() benötigt nur ein Argument | calloc() benötigt zwei Argumente. |
| 3. | malloc() ist schneller als calloc. | calloc() ist langsamer als malloc() |
| 4. | malloc() hat eine hohe Zeiteffizienz | calloc() hat eine geringe Zeiteffizienz |
| 5. | malloc() wird verwendet, um die Speicherzuweisung anzuzeigen | calloc() wird verwendet, um eine zusammenhängende Speicherzuweisung anzuzeigen |
| 6. | Syntax: void* malloc(size_t size); | Syntax: void* calloc(size_t num, size_t size); |
| 8. | malloc() initialisiert den Speicher nicht auf Null | calloc() initialisiert den Speicher auf Null |
| 9. | malloc() verursacht keinen zusätzlichen Speicheraufwand | calloc() erhöht den Speicheraufwand |