Wenn Sie struct
von einer Funktion zurückgeben müssen, würden Sie normalerweise stattdessen einen Zeiger auf struct
zurückgeben.
Wenn Sie dann ein Array von Strukturen zurückgeben wollen, empfehlen wir:
Ich habe ein Diagramm für die beiden folgenden Optionen gezeichnet:
1:
2:
Gegeben die folgende Strukturdefinition
%Vor%Hier ist ein Beispielcode für den Zugriff auf die Felder der Strukturen aus den beiden Optionen:
Option # 1:
%Vor%Option # 2:
%Vor% Das einzige Problem, das ich sehe, um Version 1 nicht zu verwenden, ist, dass es einfacher ist, die Anzahl der Strukturen (zurückgegeben) in der zweiten Version zu identifizieren, da ein NULL
-Zeiger als Stopperelement verwendet werden kann In der ersten Version ist es unter Umständen nicht möglich, ein Stopperelement zu definieren.
Wenn Sie keinen guten Grund haben, einen Zeiger auf Zeiger zurückzugeben (wenn Sie z. B. später die Zeiger selbst ändern wollen), denke ich, dass ein Zeiger auf die Struktur gut genug ist. Keine Notwendigkeit, mit doppelten Zeigern herumzutricksen.
Als Beispiel für ein Anfängerbuch über C wäre die Frage mit Option 1 (keine Umleitung) eindeutig besser, wie die bisherigen Antworten gezeigt haben. Wenn es jedoch mehr zu der Frage gibt (z. B. welcher der beste Weg ist, Strukturen in einem großen Rahmen zu passieren), dann würde ich sicherlich für Option 2 gehen. Warum? Strukturen sind komplexe Einheiten von Daten und neigen dazu, eigenständige Einheiten zu werden, die auf unterschiedliche Weise zugeordnet und weitergegeben werden - jeder Code, der sie durch direkten Zugriff behandelt, muss neu geschrieben werden, wenn die Datenverarbeitung komplexer wird.
Für mich wächst die Code-Komplexität mit zunehmender Anzahl von Umleitungen noch schneller. Daher bevorzuge ich Option # 1: struct values *foo()
.
Sollten Datenanforderungen in Richtung # 2: struct values **foo()
verschoben werden, schlagen Sie vor, einen neuen Typ typedef struct values *ValuesSet
zu erstellen und einen Zeiger auf diesen zurückzugeben: ValuesSet *foo()
.