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