Hallo, ich habe mal eine Frage zur malloc() Funktion: Wenn ich in einer Funktion eine interne Variable definiere, z.B char *text; und ich dann mit malloc Speicher reserviere, also text = (char *) malloc(size); Bleibt der Speicher auch nach dem Verlassen der Funktion reserviert, wenn ich kein free(text) mache? Oder würde bei einem erneuten Aufruf der Funktion immer mehr Speicher reserviert werden? MfG
Der Speicher bleibt reserviert. Nur der Speicher des Pointers selber wird freigegeben (da lokal) aber der Speicher auf den er zeigt bleibt allokiert. Deshalb immer_ _allen reservierten Speicher wieder freigeben.
Wie würde ich denn eine Variable char *s[10]; und wenn ich Speicher für die einzelnen Elemente mit s[0] =(char *) malloc(size1); s[1] =(char *) malloc(size2); . . reserviere wieder freigeben?
Insgesamt musst du 10 Mal free() aufrufen, also für jeden malloc-Aufruf ein Mal.
Genau. Für jeden malloc-Aufruf muß es einen dazugehörigen free-Aufruf geben. Übrigens: Den Cast solltest du weglassen. Der ist unnötig und verdeckt nur einen potentiellen Fehler.
Danke für eure Hinweise. Der Cast nach char steht so in meinem Kernighan&Ritchie allerdings auch drin. Malloc gibt einen Pointer vom Typ void zurück den ich dann noch in meinen benötigten Typ umwandeln muss. So habe ich das jedenfalls verstanden. Vielleicht sollte man mal in die Implementierung von malloc reinschauen.
> Malloc gibt einen Pointer vom Typ void zurück den ich dann noch in > meinen benötigten Typ umwandeln muss. So habe ich das jedenfalls > verstanden. Diese Konvertierung passiert automatisch. Daher ist dein Cast überfüssig. Allerdings kann es ja mal passieren, daß du ein #include <stdlib.h> vergisst. Der Compiler wird den Aufruf von malloc trotzdem akzeptieren und die Funktion implizit deklarieren, aber als Rückgabetyp per default int statt void* annehmen. Das heißt, daß der Code mit Cast immer noch durch den Compiler geht, aber nicht unbedingt das macht, was du willst. Ohne Cast bekommst du eine Meldung vom Compiler. Man kann beim gcc zwar einstellen, daß er generell eine Warnung bringt, wenn eine Funktion implizit deklariert wird, so daß man immer gewarnt wird, aber auch dann bringt der Cast keinerlei Vorteil.
Der Cast ist in C unnötig und wie Rolf schon gesagt hat, kann er einen potentiellen Fehler verbergen. In C ist ein void* zu jedem anderen Pointer kompatibel, soll heissen, kann jedem anderen Pointer-Typ zugewiesen werden. Dahingegen musst Du Dir einen Cast in etwa so vorstellen, als ob Du mit blutunterlaufenen Augen auf Deinen Rechenknecht zugehst und mit Schaum vor dem Mund vor Dich hinsabberst: "Du machst jetzt was ich will. Es ist mir schei...egal, ob die Typen passen oder nicht. Ich bin der Herr im Haus und wenn ich sage ...." Ein cast kann richtig sein, muss es aber nicht. Was ein cast aber auf jeden Fall macht: Er schuechtert den Compiler so ein, dass er sich jeglichen Kommentars verkneift, selbst wenn ein Blinder greifen koennte, das das Geschriebene offensichtlicher Bloedsinn ist. Fazit: casten nur wenns unbedingt notwendig ist und gar nicht anders geht. Ein cast ist eine Waffe! Im obigen Fall ist es nicht notwendig.
Mal noch eine generelle Frage: Ab welcher benötigten Speichergröße ist es überhaupt sinnvoll der Speicher mittels malloc anzufordern? (Auf einem "normalen" PC-System) Beispielsweise benötige ich in einer Funktion ein char Array von maximal 1000. Sollte man das noch als festes Array hinterlegen? Von der Geschwindigkeit dürfte das ja auch schneller sein, da die Speicheranforderung ans Betriebssystem auch immer seine Zeit benötigen wird.
Diese Frage kann man nicht allgemein beantworten. Wenn du genuegend Platz auf dem Stack hast, kannst du den array als lokale Variable deklarieren und brauchst dich nicht um das memory management (free) zu kuemmern. Wenn der array auch ausserhalb deines Funktionskontextes erhalten bleiben soll, dann hast du nur die Alternative globale Variable oder eben per malloc den Speicher vom heap zu besorgen. Beides hat vor und Nachteile. Um sich vor memory leaks zu schuetzen benutzt man malloc/free am besten nur, wenn das Problem anders nicht sinnvoll zu loesen ist bzw. die benoetigte Speichermenge erst zur Laufzeit ermittelt werden kann.
>> Mal noch eine generelle Frage: >> Ab welcher benötigten Speichergröße ist es überhaupt sinnvoll der >> Speicher mittels malloc anzufordern? (Auf einem "normalen" >> PC-System) auf einem pc (windows) kannste locker mehrere 100kb auf den stack packen (also lokale variablen z.b.)
> Um sich vor memory leaks zu schuetzen benutzt man > malloc/free am besten nur, wenn das Problem anders nicht > sinnvoll zu loesen ist bzw. die benoetigte Speichermenge > erst zur Laufzeit ermittelt werden kann. Und auch dann gibt es je nach Art des Problems und je nachdem welchen Standard der verwendete Compiler unterstützt andere Alternativen zu malloc(), z.B. alloca() (Falls das Array zwar grundsätzlich ein lokales Array sein darf, aber seine Grösse zur Kompilierzeit nicht bekannt ist).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.