(Zeiger auf ) Array von Zeigern

Gast #1484173
Lesenswert?

Ich habe ein Array von Strukturen:
1
struct MyStruct MyStructArray [] = {...}

Auf eine Auswahl der Elemente möchte ich über ein weiteres Array 
zugreifen können:
1
struct MyStruct * MyStructPointerArray [] = {&MyStructArray[0], ...}

Der Zugriff soll in einer Funktion geschehen:
1
MyFunction(struct Mystruct * MyStructPointer)
2
{
3
  struct MyStruct *MyStructPointer_local;
4

5
  for (MyStructPointer_local=MyStructPointer; MyStructPointer_local < sizeof MyStructPointer / sizeof (MyStructPointer[0]); MyStructPointer_local++)
6
  {
7
    AnotherFunction(MyStructPointer_local);
8
  }
9
};

Ich bekomme allerdings eine Warnung:
1
warning: passing argument 1 of 'MyFunction' from incompatible pointer type
 und mein Programm tut nicht.

Wahrscheinlich gehe ich umständlich vor, Vereinfachungen sind natürlich 
willkommen! Danke.
#1484199
Lesenswert?

MyStructPointerArray ist ein Feld von Zeigern auf struct MyStruct.

Wenn man ein Feld als Parameter übergibt, wird tatsächlich
nicht das Feld übergeben, sondern ein Zeiger auf sein erstes
Element.

Also wird beim Funktionsaufruf ein Zeiger auf das unterste
Element in MyStructPointerArray übergeben, also die Adresse
von MyStructPointerArray[0].

MyStructPointerArray[0] hat den Typ struct MyStruct*.
Davon wird die Adresse übergeben; diese hat den Typ
struct MyStruct**.

Also wäre der richtige Typ des Parameters nicht wie
hier struct MyStruct*, sondern struct MyStruct**.

mfgkw
#1484304
Lesenswert?

Gast schrieb:
> Ah, dankeschön für die Erklärung!
> Allerdings - wie iteriere ich dann über MyStructPointerArray?

2 Möglichkeiten:
* Die Länge des Arrays der Funktion mitgeben
* Vereinbarung treffen, dass der "letzte" Pointer im Array immer
  ein NULL Pointer ist

Aber egal wie du es drehst und wendest: Die Funktion hat keine Chance, 
ohne Hilfe von außen die Länge des Arrays festzustellen. Das ist nun mal 
so in C. Lebe damit und arbeite damit.

(Was denkst du, warum wohl ist die Signatur von main in seiner 
ausführlichen Form

 int main( int argc, char * argv[] )

argc ... Anzahl Argumente
argv ... die tatsächlichen Argumente in Arrayform, wobei jeder
         Pointer im Array auf einen String für das Argument zeigt
Gast #1484331
Lesenswert?

>> Allerdings - wie iteriere ich dann über MyStructPointerArray?
> Vielleicht solltest du erstmal klären,
Stimmt, das war falsch ausgedrückt:
Ich möchte über verschiedene Listen mit ausgewählten Adressen von den 
Elementen aus MyStructArray iterieren.
#1484342
Lesenswert?

Gast schrieb:

> Ich möchte über verschiedene Listen mit ausgewählten Adressen von den
> Elementen aus MyStructArray iterieren.

Dann bleibt dir nichts anderes übrig, als der Funktion die Länge des 
Arrays irgendwie mitzuteilen, direkt oder indirekt. (siehe Post von 
Karl-Heinz)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren