malloc / free vor Pointer Return ?

OP #2903626
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;
}
#2903633
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.
Gast #2903643
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).
Gast #2903660
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".
#2903666
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren