Geben Sie eine Struktur von der Funktion in C zurück

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Standardnotation, um ein struct aus einer Funktion zurückzugeben
  2. Zeiger-Notation verwenden, um struct von der Funktion zurückzugeben
Geben Sie eine Struktur von der Funktion in C zurück

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C Struct