mikrocontroller.net

Forum: PC-Programmierung malloc in Funktionen


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo... nennt sich memory-leak;)

73

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Christoph __ (chris)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (heinzi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: The Daz (thedaz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: pittbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.