15.4 Strukturen als Rückgabewert einer Funktion 

Wie bei der Werteübergabe von Strukturen sollten Sie auch bei der Werterückgabe von Strukturen Zeiger verwenden. Dafür soll wieder das eben geschriebene Listing verwendet werden. Es fehlt nämlich noch eine Funktion zur Eingabe der einzelnen Strukturelemente. Hier sehen Sie das Listing mit der Funktion eingabe(), die die Anfangsadresse der Struktur zurückgibt:
/* struct4.c */ #include <stdio.h> #include <stdlib.h> #define MAX 30 struct adres { char vname[MAX]; char nname[MAX]; long PLZ; char ort[MAX]; int geburtsjahr; }; /* Funktion zur Ausgabe des Satzes */ void ausgabe(struct adres *struct_ptr) { printf("\n\nSie gaben ein:\n\n"); printf("Vorname.........:%s",struct_ptr->vname); printf("Nachname........:%s",struct_ptr->nname); printf("Postleitzahl....:%ld\n",struct_ptr->PLZ); printf("Ort.............:%s",struct_ptr->ort); printf("Geburtsjahr.....:%d\n",struct_ptr->geburtsjahr); } struct adres *eingabe(void) { static struct adres *adressen; adressen = malloc(sizeof(struct adres)); printf("Vorname : "); fgets(adressen->vname, MAX, stdin); printf("Nachname : "); fgets(adressen->nname, MAX, stdin); printf("Postleitzahl : "); do {scanf("%ld",&adressen->PLZ);} while(getchar()!= '\n'); printf("Wohnort : "); fgets(adressen->ort, MAX, stdin); printf("Geburtsjahr : "); do { scanf("%d",&adressen->geburtsjahr); }while(getchar()!='\n' ); return adressen; } int main(void) { struct adres *adresse1, *adresse2; adresse1=eingabe(); adresse2=eingabe(); ausgabe(adresse1); ausgabe(adresse2); return EXIT_SUCCESS; }
Bei diesem Listing verwenden Sie bereits nur noch Zeiger und kommen zum ersten Mal mit den dynamischen Datenstrukturen in Berührung. Aufgerufen wird diese Funktion zur Eingabe von Strukturelementen mit:
adresse1 = eingabe();
Einen Adressoperator benötigen Sie hier nicht, da Sie ja bereits einen Zeiger verwenden. Und da Sie hier einen Zeiger verwenden, benötigen Sie in der Funktion erst einmal Speicherplatz für eine Struktur. Dieser wird mit der Funktion malloc() angefordert:
static struct adres *adressen; adressen = malloc(sizeof(struct adres));
Jetzt können Sie mithilfe des Elementkennzeichnungsoperators die Daten der einzelnen Strukturelemente einlesen. Am Ende der Funktion wird die Adresse dieser reservierten und mit neuem Inhalt versehenen Struktur mit return an den Aufrufer zurückgegeben. In der main()-Funktion zeigt jetzt der Zeiger adresse1 auf diesen Speicherbereich.
Hinweis für Anfänger |
In den letzten beiden Kapiteln ist der Schwierigkeitsgrad enorm gestiegen. Falls Sie hier nur Bahnhof verstanden haben, machen Sie sich keine Sorgen: Im weiteren Verlauf dieses Buches fügen sich auch für Sie die einzelnen Puzzle-Teile zu einem Ganzen. Die nächsten Abschnitte werden jetzt wieder um einiges verständlicher sein. |
Natürlich lässt sich eine Funktion mit Strukturen als Rückgabewert auch einfacher deklarieren:
struct typNAME Funktionsname()
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.