gueltigkeitsbereich von [cm]allc



  • Hallo,

    ich wuerde gerne wissen, wie lange Speicher gueltig ist, den ich mit malloc reserviert habe. Wenn ich in C++ in einer Funktion 'foo' new 'object' ausfuehre, so ist 'object' auch in einer Funktion 'bar' zugaenglich, von der aus ich 'foo' aufgerufen habe. das Object bleibt scope-uebergreifend am Leben, bis ich es mi delete loesche.

    Mit malloc scheint dies nicht der Fall zu sein, zumindest bekomme ich bei

    #include <stdio.h>
    #include <stdlib.h>
    
    void foo (char* w)
    {
        w = (char*) malloc(29);
        w[0] = 'a';
        if (!w)
        {
            printf("Seltsam, w ist 0.\n");
        }
    
    }
    
    int main(void)
    {
        char* w = 0;
    
        foo(w);
        if (!w)
        {
            printf("Seltsam, w ist 0.\n");
        }
        return 0;
    }
    

    genau einmal die Aussage, dass w=0.
    Bedeutet dies, dass ich malloc immer nur auf oberster scope-Ebene ausfuehren kann, oder mache ich etwas falsch?



  • tim_g schrieb:

    Hallo,

    ich wuerde gerne wissen, wie lange Speicher gueltig ist, den ich mit malloc reserviert habe.

    So lange, bis du ihn mit free oder das Betriebsystem (z.B. bei Programm-Terminierung) wieder freigibt.
    In deiner Funktion foo werden 29 Bytes auf dem Heap allokiert. Der Zeiger w zeigt auf den Anfang dieses Bereichs. Bei Beendigung der Funktion wird die lokale Variable w zerstört, aber der reservierte Speicher bleibt erhalten. Auf den Speicher haste jetzt also keinen Zugriff mehr.
    Das w deiner main Funktion kriegt von all dem nix mit, da du den Zeiger by value übergibst.



  • interpreter schrieb:

    Das w deiner main Funktion kriegt von all dem nix mit, da du den Zeiger by value übergibst.

    Ergänzung: Und um die Adresse ans Hauptprogramm zu übergeben, müsstest du w by reference (pointer) übergeben:

    void foo(char**pw)
    {
      *w = (char*) malloc(29);
      ...
    }
    
    ...
    int main()
    {
      char* mw;
      foo(&mw);
      printf("w ist %p:%s",mw,mw);
    }
    


  • tim_g schrieb:

    w = (char*) malloc(29);

    Den Rückgabewert von malloc sollte man nicht casten. Ist auch gar nicht notwendig. Der void*, den malloc zurückgibt, kann in implizit in char* konvertiert werden.



  • MFK schrieb:

    tim_g schrieb:

    w = (char*) malloc(29);

    Den Rückgabewert von malloc sollte man nicht casten. Ist auch gar nicht notwendig. Der void*, den malloc zurückgibt, kann in implizit in char* konvertiert werden.

    Wenn man einen C-Compiler hernimmt ;). Der C++-Compiler meckert da nämlich, wenn man es nicht castet.



  • AJ schrieb:

    Wenn man einen C-Compiler hernimmt ;).

    Davon bin ich in diesem Forum mal ausgegangen 😉

    Der C++-Compiler meckert da nämlich, wenn man es nicht castet.

    Wenn ich einen C++-Compiler habe, benutze ich kein malloc.



  • MFK schrieb:

    Der C++-Compiler meckert da nämlich, wenn man es nicht castet.

    Wenn ich einen C++-Compiler habe, benutze ich kein malloc.

    😕



  • interpreter schrieb:

    MFK schrieb:

    Der C++-Compiler meckert da nämlich, wenn man es nicht castet.

    Wenn ich einen C++-Compiler habe, benutze ich kein malloc.

    😕

    Er benutz new und delete.



  • hat sich erledigt 😉


Anmelden zum Antworten