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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.