Forum: Mikrocontroller und Digitale Elektronik malloc / free vor Pointer Return ?


von Torsten B. (torty)


Lesenswert?

Hallo Gemeinde
Ich möchte ein Unterfunktion einen Zeiger auf eine Struktur 
zurückliefern lassen.
Damit ich den Zeiger  "ptrSuperkunde" in "strcpy" verwenden kann braucht 
er ein Ziel, den ich ihm mit "malloc" gebe.
Nachdem ich die Elemente beschrieben habe, möchte ich den Zeiger von der 
Funktion zurückgeben lassen.

MUSS / DARF ich vorher das "free" ausführen ???

Gibt es hier etwas schlaueres ???

Dnake für Eure Hilfe
Torsten



struct Adresse *ptrAusgabe(char Vorname[20], char Nachname[20])
{
  struct Adresse *ptrSuperkunde = malloc(sizeof(struct Adresse));

  strcpy((*ptrSuperkunde).Name, Vorname);
  strcpy((*ptrSuperkunde).Nachname, Nachname);

   ???? free(ptrSuperkunde); ??????

  return ptrSuperkunde;
}

von Thomas W. (diddl)


Lesenswert?

Ne, auf keinen Fall das free() ausführen. Sonst darfst du den pointer 
nicht mehr zurückgeben, weil der Speicherbereich ja nicht mehr belegt 
ist.

Und ohne free() wird der Speicher nach jedem Aufruf von ptrAusgabe() 
etwas kleiner. Die aufrufende Funktion muss free() aufrufen wenn der 
Speicher nicht mehr benötigt wird.

von Norbert (Gast)


Lesenswert?

Torsten B. schrieb:
> MUSS

Nein

> DARF

Nein

von holger (Gast)


Lesenswert?

>MUSS / DARF ich vorher das "free" ausführen ???

Wenn du das free() ausführst ist dein Datensatz bereits
Geschichte bevor du den Pointer darauf zurückgibts.
So wird das nichts.

von Torsten B. (torty)


Lesenswert?

danke für Deine Antwort.

Ich habe es mir fast gedacht.
Ich muss also in der darüber liegenden Ebene das free ausführen...
Umständlich und eine große Fehlerquelle.

Kann ich das nicht anders machen.. ohne malloc & free ?


Grüße
TOrsten

von Norbert (Gast)


Lesenswert?

Torsten B. schrieb:
> Kann ich das nicht anders machen.. ohne malloc & free ?

Wenn deine Funktion nicht rekursiv aufgerufen wird,
könntest du den benötigten Speicherplatz einmal lokal statisch 
allokieren.
Dann wird er nur einmal angelegt und immer wieder genutzt (bei jeder 
erneuten Nutzung überschrieben).

von DirkB (Gast)


Lesenswert?

Torsten B. schrieb:
> Kann ich das nicht anders machen.. ohne malloc & free ?

Übergib deiner Funktion einen Zeiger auf struct Adresse.

Dann ist deine rufende Funktion dafür zuständig.

Allerdings sieht das fast so aus, als ob auch in der struct die Felder 
eine statische Größe haben. Da wird dann Speicherplatz "verschwendet".

von Markus M. (adrock)


Lesenswert?

Nein.

Wieso willst Du den Speicher für die Struktur gleich wieder freigeben? 
Du würdest dann einen Zeiger auf freigegebenen Speicher zurückliefern, 
das ergibt keinen Sinn.

Du solltest Dir wenigstens noch die Mühe machen, zu testen ob die 
Belegung des Speichers überhaupt funktioniert hat. Also alles nach dem 
malloc() Aufruf in einen if Konstrukt:

if(ptrSuperkunde != NULL) {
...
}
return ptrSuperkunde;
}

Außerdem hat die Angabe der Größe des char-Arrays in der Parameterliste 
m.W. garkeine Auswirkung. D.h. Du kannst Dich nicht darauf verlassen, 
dass nur 20 Zeichen übergeben werden. Der String wird sowieso nur als 
Zeiger übergeben...

Evtl. lieber strncpy() verwenden, aber nicht vergessen das letzte Byte 
auf jeden Fall auf '\0' zu setzen.

Grüße
Markus

von Karl H. (kbuchegg)


Lesenswert?


von Franka (Gast)


Lesenswert?

Warum sollte man Speicher vor der Benutzung freigeben ?

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.