C Dynamische Speicherverwaltung

Hallo,

ich lerne C programmieren und vestehe die Dynamische Speicherverwaltung nicht wirklich und Tutorials sind auch nicht gerade gut.

Hier das Programm:http://pastebin.com/Y1nYk3um

Danke im voraus :smile:

Gruß MrAnonym

Sehr geehrter MrAnonym,

Sie haben eine Frage ?
Sind das Übungsaufgaben (Ihre Hausaufgaben) ?

Mit freundlichem Gruß

TechPech 1984

Das ist eine Übungsaufgabe.

Hallo MrAnonym,

Hier das Programm:http://pastebin.com/Y1nYk3um

Pointer (Zeiger) enthalten eine Speicheradresse an welcher sich Daten befinden.

char *ptr = NULL;

ptr
liefert dann die Speicheradresse und
*ptr
zeigt auf den Speicherbereich welcher char-typen enthält

NULL
ist ein definierter Wert und markiert einen Pointer als undefiniert/ungültig. Debugger und die Debug-Laufzeitbibliotheken kennen diesen Wert und können so konfiguriert werden, dass bei verwendung eines Pointers mit dem Wert NULL eine Fehlermeldung ausgegeben wird.

inFile=fopen(filename,„rt“);
Bei Erfolg liefert fopen() eine Pointer auf eine Struktur welche vom Betriebssystem zur Verwaltung der Datei-Operationen benötigt wird.
Bei einem Misserfolg liefert fopen() den Wert NULL.

Grundsätzlich liefern alle Funktionen, welche eine Pointer zurückgeben, bei einem Misserfolg den Wert NULL zurück. Eigene sollten dies auch tun.
Der konkrete Wert von NULL hängt vor allem von der verwendeten CPU ab. Meistens verwendet der Compiler einen Wert, welcher typischerweise ins ROM zeigt. Das kann dann wirklich die Speicheradresse 0 sein oder eine am Ende des Speicherbereichs.
BTW: In Pascal wird dieser Wert als NIL, von lat. NIHIL = Nichts, bezeichnet.

In C gibt es drei gundlegende Bereiche in welchen Variablen abgelegt werden:

  1. automatische
    Diese innerhalb einer Funkttion deklariert und werden auf dem Stack abgelegt. Wenn die Funktion beendet wird, wird auch dieser Speicherplatz freigegeben und die Variablen verschwinden.
    Ein typischer Fehler ist z.B. so etwas:

    char *f(void)
    (
    char txt[10];

    // mach was und legst in txt ab
    return (txt);
    )

Die Funktion liefert die Speicheradresse von txt zurück, aber txt ist frei gegeben worden.

  1. statische
    Statische Variablen werden entweder global, d.h. ausserhalb jeder Funktion deklariert oder innerhalb einer Funktion zusammen mit dem Schlüsselwort „static“.
    Statische Variablen bekommen einen festen Speicherplat zugeteilt und sind für die Lebensdauer des Programms gültig.

Die bisher genannten Variablen haben einen grossen Nachteil:
Ihre Grösse muss zur Compilierzeit schon bekannt sein!

  1. dynamische
    Hierzu gehört der Heap. Dies ist ein Speicherbereich, welcher meistens vom Betriebssystem verwaltet wird.
    mit
    malloc() kann ich mir nun zur Laufzeit einen Speicherblock aus dem Heap geben lassen. Das Argument von malloc() ist die Anzahl Bytes welche ich haben möchte. Bei einem erfolgreichen Aufruf bekomme ich einen Speicherblock welcher mindestens die Grösse der angeforderten Bytes hat.
    Im Fehlerfall, meist wenn kein freier Speiche im Heap mehr vorhanden ist, liefert malloc() den Wert NULL.
    Mit free() kann man dann einen mit malloc() erhaltenen Block wieder frei geben.

MfG Peter(TOO)