Programmieren in C

Dynamische Speicherverwaltung I – malloc

Du möchtest wissen, wie du deinen Speicher mithilfe von malloc dynamisch verwalten kannst? Im folgenden Beitrag zeigen wir dir wie es geht.

 

Warum dynamische Speicherverwaltung?

Beginnen wir wie immer mit dem Warum. Warum dynamisch Speicherplatz reservieren, wenn du einfach bereits am Anfang deines Quellcodes ein riesiges Array reservieren kannst? Die so festgelegte Größe ist statisch. Das heißt, du kannst während der Laufzeit deines Programmes nur höchstens so viele Komponenten verwenden, wie du zu Beginn reserviert hast.

C malloc
Dynamische Speicherverwaltung

Das mag dir jetzt noch nicht wie ein Problem erscheinen, aber was, wenn du mal ganze Texte einlesen musst? Oder wenn du mal fast gar keine Zeichen benötigst? Egal welches der beiden Extreme der Fall ist, du hast immer ein Problem. Entweder du hast nicht genug Speicherplatz und kannst nur einen Teil deines Strings abspeichern oder du hast zu viel Speicherplatz reserviert und verschwendest den nicht verwendeten.

Wie kann man Speicher reservieren? 

Nun, da du weißt, warum du Speicherplatz dynamisch reservieren solltest, kommen wir doch direkt einmal zum wie. Es gibt zwei verschiedene Methoden, Speicher zu reservieren. Wir betrachten hier die malloc-Methode. Um überhaupt auf irgendeine Weise Speicherplatz reservieren zu können, müssen wir erst einmal daran denken, die Standard-library einzubinden. Sie enthält nämlich auch die Funktion, die wir jetzt gleich nutzen werden.

Mit malloc versuchen wir, einen zusammenhängenden Speicherbereich der Größe size Byte zu reservieren. Ist das erfolgreich, gibt die Funktion die Adresse des reservierten Bereiches zurück. Schlägt die Operation fehl, erhalten wir stattdessen den Wert NULL.

C malloc
malloc

Wichtig ist hier für uns, dass wir immer beachten, dass malloc den Speicherplatz ohne Initialisierung reserviert. Das heißt, was auch immer vorher in den betreffenden Speicherzellen stand, steht dort auch weiterhin, solange wir es nicht überschreiben.

Zerlegung size und free-Befehl

Des Weiteren ist es noch wichtig, dass wir nicht einfach drauflos reservieren können, sondern darauf achten müssen, dass size noch weiter zerlegt werden muss. Das liegt daran, dass verschiedene Datentypen verschiedene Mengen an Speicher benötigen. Um size zu erhalten, multiplizieren wir also die Größe des gewünschten Datentypen sizeoftype mit der gewünschten Menge an speicherbaren Werten sizeofarray.

C malloc
size Zerlegung

Schlägt die Speicherplatzreservierung fehl, geben wir eine Fehlermeldung aus und beenden das Programm. Funktioniert die Reservierung jedoch, kommunizieren wir das unseren Usern und fahren fort. In unserem Beispiel mag das zwar das Ende der Funktion sein, jedoch steht es dir frei, danach alle ganz normalen Funktionen und Operationen auszuführen, die du für dein Programm brauchst. Das ist im Übrigen solange der Fall, bis du am Ende deinen reservierten Speicherplatz wieder freigibst.

C malloc
free-Befehl

Tust du das nicht, bleibt dieser Speicher reserviert. Du kannst allerdings dann auf den korrespondierenden Zeiger nach Ende seines Gültigkeitsbereiches nicht mehr zugreifen. So ein Missgeschick nennt man Speicherleck. Solche Löcher lassen sich allerdings ganz leicht verhindern. Dazu gibst du, sobald du den Pointer nicht mehr brauchst, dessen Speicherbereich mit dem free-Befehl wieder frei.

Hallo, leider nutzt du einen AdBlocker.

Auf Studyflix bieten wir dir kostenlos hochwertige Bildung an. Dies können wir nur durch die Unterstützung unserer Werbepartner tun.

Schalte bitte deinen Adblocker für Studyflix aus oder füge uns zu deinen Ausnahmen hinzu. Das tut dir nicht weh und hilft uns weiter.

Danke!
Dein Studyflix-Team

Wenn du nicht weißt, wie du deinen Adblocker deaktivierst oder Studyflix zu den Ausnahmen hinzufügst, findest du hier eine kurze Anleitung.