Gibt ein Array von Strukturen oder ein Array von Strukturzeigern zurück?

8

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:

  1. gibt ein Array von Strukturen zurück (Zeiger auf das erste Element)
  2. oder ein Array von Strukturzeigern zurückgeben?

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%     
Tyilo 01.08.2013, 11:15
quelle

4 Antworten

6

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.

    
alk 01.08.2013, 11:23
quelle
5

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.

    
user529758 01.08.2013 11:19
quelle
1

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.

    
slartibartfast 01.08.2013 14:03
quelle
0

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() .

    
chux 01.08.2013 13:38
quelle

Tags und Links