malloc und free



  • Hallo.

    Eine Frage zur re-Initialisierung.

    Code-Gerüst

    char *var = malloc (100000);
    // Arbeite damit und möchte reinitialisieren mit anderen Wert
    var = malloc (50000);
    // Arbeite wieder damit und beende das Programm
    free (var);
    

    Kann man das so machen oder muss man die 100000 vorher irgendwie "freigeben"?
    Wenn ich vor das malloc (50000) ein "free (var);" setze, dann bekomme ich diverse Speicherfehler im Programm.

    Über eine Antwort würde ich mich freuen. Danke.



  • Ich denke du suchst realloc() 😉



  • Das obere Beispiel "funktioniert" so. Zumindest bekomme ich keine Fehler, aber es ist nicht richtig und hat "leaks"?

    Ich lese in var eine Datei ein die ausserhalb geändert wird und periodisch so geladen.

    Grund Gerüst

    bool readfile(filename)
    {
    // ermittel dateigrösse und inhalt
    char var = malloc (filesize+1);
    read(handle,var,filesize);
    }
    

    also müste ich das so umstricken?

    bool readfile(filename)
    {
    // ermittel dateigrösse und inhalt
    if (!var) var = malloc (filesize+1);
    else var = realoc(var,filesize+1);
    read(handle,var,filesize);
    }
    


  • Genau so musst du das machen. Und freigeben tust du ganz am Ende.



  • Stimmt nicht ganz.

    Die Bedingung "if (!var)" wird niemals erreicht.
    Er geht immer in die "else". da es aber funktioniert kann man auch gleich realloc() allein nehmen. Scheinbar muss kein vorheriges malloc existieren.
    Was mich aber auch wundert ist das ich immer dachte erst wenn ein pointer ein mit malloc zugewiesenen Speicherbereicht hat er true ist.

    Also

    char *var;
    if (!var) puts("leer");
    var = malloc(1);
    if (var) puts("voll");

    Aber scheinbar ist es immer "voll", verstehe ich erlich nicht 🙄



  • Wenn Du einen integralen Datentyp instanziierst, wird er nicht initialisiert. Es steht schlichtweg Müll drin. Das ist auf 32-bit eine 1:4Mio Chance dass "false" (also 0) drin steht 😉



  • schnuffel schrieb:

    bool readfile(filename)
    {
    // ermittel dateigrösse und inhalt
    if (!var) var = malloc (filesize+1);
    else var = realoc(var,filesize+1);
    read(handle,var,filesize);
    }
    

    Bei realloc kann der erste Parameter (der ursprüngliche Speicherbereich) auch 0 sein. In diesem Fall verhält sich realloc wie malloc. Eine Überprüfung mit "if (!var) ..." ist daher nicht nötig.


Anmelden zum Antworten