Forum: PC-Programmierung malloc in Funktionen


von Thomas (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

jo... nennt sich memory-leak;)

73

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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?

von Christoph _. (chris)


Lesenswert?

Insgesamt musst du 10 Mal free() aufrufen, also für jeden malloc-Aufruf
ein Mal.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Karl heinz B. (heinzi)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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.

von The D. (thedaz)


Lesenswert?

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.

von pittbull (Gast)


Lesenswert?

>> 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.)

von Bartli (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.