Wann benutze ich malloc() in C?

4 Antworten

Für einen Integer wirst du malloc eher nicht verwenden. Das ist eher für Arrays und structs gedacht. Der entscheidende Unterschied ist, dass in deinem ersten Beispiel Speicher auf dem Stack allokiert wird, während bei malloc der Heap genutzt wird. Der Stack ist normalerweise ziemlich klein und sollte daher sparsam genutzt werden. Er wird für Funktionsaufrufe und lokale Variablen genutzt.

malloc ist also dann ratsam, wenn die erforderliche Speichermenge zur Kompilierzeit unbekannt ist und erst zur Laufzeit bekannt wird. Der Heap ist wesentlich größer als der Stack und wird somit nicht so schnell überlaufen.

Ein weiterer Unterschied ist, dass allokierter Speicher auf dem Stack automatisch am Ende der Funktion freigegeben wird. Somit darfst du keinen Pointer auf solchen Speicher zurückgeben. In diesem Fall ist malloc erforderlich, denn dabei wird der Speicher nicht automatisch freigegeben. Er muss manuell mittels free freigegeben werden, sobald er nicht mehr benötigt wird.

Du nutzt malloc immer dann, wenn Du dynamisch Speicher allokieren willst, weil Du entsprechend große Menge brauchst und/oder Du a priori nicht weißt, wie viel Speicher Du überhaupt brauchen wirst.

Es gibt zwar auch VLAs, aber naja.

Nehmen wir mal ein Beispiel:

... somefunc (....){
   char buf[8192];
   .....
}

buf wird auf dem Stack allokiert. 8KB Stackframe, naja, solange es nicht rekursiv ist, fällt mir das nicht auf die Füße.

Die Stackgröße ist üblicherweise aber limitiert.

Der hier allokierte Speicher auf dem Stack wird mit Ende der Funktion freigegeben, ich darf keine Referenzen (Pointer) darauf weiterverwenden. Der durch vorige Allokation zugesicherte Speicher ist ähnlich wie ein static dauerhaft allokiert, zumindest bis ich ein free() aufrufe, Referenzen behalten auch über Funktionsaufrufe hinweg Gültigkeit.

Das brauchst Du immer dann, wenn Du zur Programmierzeit nicht weißt, wie viel Speicher du brauchst.

Zum Beispiel für ein Feld einer Größe, die Du erst zur Laufzeit kennst.

Wegen dieser umständlich und fehleranfälligen Speicherverwaltung ist es oft gut auf modernere Sprachen wie C# zu wechseln.


Butzti 
Beitragsersteller
 03.03.2022, 00:43

Ja, ich habe auch mit Java, Python angefangen. Wir brauchen C aber im nächsten Semester.

0
Schachpapa  03.03.2022, 00:47
@Butzti

malloc in C macht ungefähr das, was new in Java macht. Nur dass Java den Platz automatisch wieder freigibt, wenn das Objekt, für das der Speicherplatz angefordert wurde, aufhört zu existieren (weil es keine Referenz mehr dafür gibt)

0
ich habe vor ein paar Tagen angefangen

Dann wirst du dynamische Datenstrukturen, die zur Programmlaufzeit wachsen und schrumpfen können, sicher noch kennenlernen.