Video

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

Inhaltsübersicht

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
direkt ins Video springen
Dynamische Speicherverwaltung I – malloc

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
direkt ins Video springen
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.

Studyflix vernetzt: Hier ein Video aus einem anderen Bereich

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
direkt ins Video springen
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
direkt ins Video springen
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.

Dynamische Speicherverwaltung I – malloc — häufigste Fragen

(ausklappen)
  • Was ist sizeof in C?
    sizeof ist ein Operator in C, der die Größe eines Datentyps oder eines konkreten Objekts in Byte liefert. Damit kann man bestimmen, wie viel Speicher ein int, char oder ein Array-Element belegt. So lässt sich die benötigte Byte-Anzahl für eine Speicherreservierung korrekt angeben.
  • Wie lautet die Syntax von malloc()?
    malloc() ruft man in C so auf: pointer = malloc(size);, wobei size die gewünschte Anzahl an Byte ist. Bei Erfolg liefert malloc() die Adresse des reservierten Speicherbereichs zurück, sonst NULL. Häufig berechnet man size aus Anzahl der Elemente und sizeof des Datentyps.
  • Warum sind die Werte im Speicher nach malloc() nicht automatisch 0?
    Nach malloc() sind die Werte nicht automatisch 0, weil malloc() nur Speicher reserviert und den Inhalt nicht initialisiert. Der reservierte Bereich enthält deshalb die Daten, die vorher zufällig an diesen Speicherstellen standen. Wenn man diese Werte liest, bevor man sie überschreibt, ist das Ergebnis nicht verlässlich.
  • Warum sollte man malloc() in C nicht verwenden?
    malloc() sollte man in C vermeiden, wenn man keinen dynamischen Speicher braucht, weil es den Code fehleranfälliger macht. Man muss den Rückgabewert auf NULL prüfen, den Speicher selbst mit sinnvollen Werten füllen und ihn später mit free() wieder freigeben. Vergisst man free(), entsteht ein Speicherleck.

Nach Beantwortung speichern wir deine Antwort, um Studyflix zu verbessern. Mehr dazu erfährst du in unserer Datenschutzerklärung.

Dynamische Speicherverwaltung II – calloc

Du kennst jetzt malloc und weißt, wie du Speicher reservierst. Allerdings gibt es noch eine Alternative: calloc. Dieser Befehl initialisiert den reservierten Speicher automatisch. Entdecke die Vorteile von calloc in unserem Beitrag zur dynamischen Speicherverwaltung II – calloc!

Zum Video: Dynamische Speicherverwaltung II - calloc
Zum Video: Dynamische Speicherverwaltung II – calloc
Lernen lohnt sich! Entdecke hier deine Chancen.