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; }
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.
>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.
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
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).
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".
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.