Geben Sie eine Struktur von der Funktion in C zurück
-
Verwenden Sie die Standardnotation, um ein
struct
aus einer Funktion zurückzugeben -
Zeiger-Notation verwenden, um
struct
von der Funktion zurückzugeben
Dieser Artikel demonstriert mehrere Methoden, wie man eine struct
von einer Funktion in C zurückgibt.
Verwenden Sie die Standardnotation, um ein struct
aus einer Funktion zurückzugeben
Das Schlüsselwort struct
wird in C verwendet, um benutzerdefinierte Datenstrukturen zu implementieren. Da wir in diesem Beispiel den Typ struct
definieren, wird es eine sauberere Notation für Funktionsdeklarationen sein, wenn wir die Struktur MyStruct
typedef
. Es wird ein neuer Typ-Alias für die gegebene Struktur assoziiert, und wir müssten nur den neuen Alias-Namen im Funktionsprototyp angeben. Jetzt können Funktionen in C die Struktur
ähnlich wie die eingebauten Datentypen zurückgeben.
Im folgenden Beispielcode haben wir eine Funktion clearMyStruct
implementiert, die einen Zeiger auf das Objekt MyStruct
entgegennimmt und das gleiche Objekt als Wert zurückgibt. Beachten Sie, dass wir auf struct
-Mitglieder mit dem ->
-Operator zugreifen müssen, wenn der Handle der Zeiger auf das struct
ist.
#include <stdio.h>
#include <stdlib.h>
enum { DAY = 9, MONTH = 2 };
typedef struct {
int day;
int month;
} MyStruct;
MyStruct clearMyStruct(MyStruct *st) {
st->day = 0;
st->month = 0;
return *st;
}
int setMyStruct(MyStruct *st, int d, int m) {
if (!st) return -1;
st->day = d;
st->month = m;
return 0;
}
int main() {
MyStruct tmp;
if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
clearMyStruct(&tmp);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
exit(EXIT_SUCCESS);
}
Ausgabe:
day: 9
month: 2
day: 0
month: 0
Zeiger-Notation verwenden, um struct
von der Funktion zurückzugeben
Im Allgemeinen neigen struct
definierte Datenstrukturen dazu, mehrere Datenelemente zu enthalten, was zu einem großen Speicherbedarf führt. Wenn es nun darum geht, relativ große Strukturen zwischen Funktionen zu übergeben, ist es am besten, Zeiger zu verwenden. Der Zeiger dient als Handle auf das Objekt und seine Größe ist unabhängig von der dort gespeicherten Struktur fest. Die Verwendung von Zeigern für die Rückgabe von struct
reduziert potenziell den Speicherverkehr und verleiht dem Code mehr Leistung. Obwohl das Programm mit Optimierungsflags kompiliert wird, kann es implizit die Anweisungen zur Datenübergabe ändern. Beachten Sie, dass wir den Typ enum
verwendet haben, um benannte konstante Integer-Werte zu deklarieren.
#include <stdio.h>
#include <stdlib.h>
enum { DAY = 9, MONTH = 2 };
typedef struct {
int day;
int month;
} MyStruct;
MyStruct *clearMyStruct2(MyStruct *st) {
st->day = 0;
st->month = 0;
return st;
}
int setMyStruct(MyStruct *st, int d, int m) {
if (!st) return -1;
st->day = d;
st->month = m;
return 0;
}
int main() {
MyStruct tmp;
if (setMyStruct(&tmp, DAY, MONTH) == -1) exit(EXIT_FAILURE);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
clearMyStruct2(&tmp);
printf("day: %d\nmonth: %d\n", tmp.day, tmp.month);
exit(EXIT_SUCCESS);
}
Ausgabe:
day: 9
month: 2
day: 0
month: 0
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook