Forum: Compiler & IDEs Struct mit Zeiger auf seinen eigenen Datentyp


von Bernhard N. (bernieserver)


Lesenswert?

Hallo,

für eine verkettete Liste in C brauche ich so etwas:
1
typedef struct 
2
{
3
    Element *Next;
4
    Element *Previous;
5
6
    uint8_t foo_Attribut
7
}Element


Lässt sich so was überhaupt realisieren?

Gruß und Danke schonmal im Voraus für hilfreiche Antworten

Bernhard

von Andreas (Gast)


Lesenswert?

Hallo Bernhard,

sicher geht das. Du deklariertst zwei Zeiger auf Speicheradressen, an 
denen sich wiederum eine Instanz des Typs "Element" befindet. Die beiden 
*Next und *Previous zeigen nicht! auf die Definition deines structs - 
nicht verwechseln.

Grüße

Andreas

von Karl H. (kbuchegg)


Lesenswert?

Bernhard N. schrieb:
> Hallo,
>
> für eine verkettete Liste in C brauche ich so etwas:
>
>
1
> typedef struct
2
> {
3
>     Element *Next;
4
>     Element *Previous;
5
> 
6
>     uint8_t foo_Attribut
7
> }Element
8
>
>
>
> Lässt sich so was überhaupt realisieren?

Natürlich

> Gruß und Danke schonmal im Voraus für hilfreiche Antworten

trenne dich von anonymen Strukturen und dein Problem löst sich in Luft 
auf.

1
struct Element_
2
{
3
  struct Element_ * Next;
4
  struct Element_ * Previous;
5
6
  uint8_t foo_Attribut;
7
};
8
9
typedef struct Element_ Element;

So mancher empfindet das gleichzeitige Definieren eines typedefs auf 
etwas das selbst gerade definiert wird sowieso als Unsitte.
Diejenigen, die noch niemals ein C-Buch durchgearbeitet haben, meinen 
sogar das müsse so sein und sind sich gar nicht bewusst, dass ihnen hier 
C erlaubt 2 Dinge in einem Aufwasch zu machen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
typedef struct Element
2
{
3
    struct Element *Next;
4
    struct Element *Previous;
5
6
    uint8_t foo_Attribut
7
} Element;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nebenbei, was durchaus auch geht:
1
struct Element;
2
3
struct Summary
4
{
5
   struct Element *first, *last;
6
   // other members here
7
};

D. h. eine tatsächliche Definition von struct Element ist weit und
breit nicht in Sicht, trotzdem darf man einen Zeiger auf selbige
bilden und benutzen.

von gagast (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Nebenbei, was durchaus auch geht:
>
>
1
> struct Element;
2
> 
3
> struct Summary
4
> {
5
>    struct Element *first, *last;
6
>    // other members here
7
> };
8
>
>
> D. h. eine tatsächliche Definition von struct Element ist weit und
> breit nicht in Sicht, trotzdem darf man einen Zeiger auf selbige
> bilden und benutzen.

...weil in C alle Zeiger gleich groß sind - oder?

von Karl H. (kbuchegg)


Lesenswert?

gagast schrieb:
> Jörg Wunsch schrieb:
>> Nebenbei, was durchaus auch geht:
>>
>>
1
>> struct Element;
2
>>
3
>> struct Summary
4
>> {
5
>>    struct Element *first, *last;
6
>>    // other members here
7
>> };
8
>>
>>
>> D. h. eine tatsächliche Definition von struct Element ist weit und
>> breit nicht in Sicht, trotzdem darf man einen Zeiger auf selbige
>> bilden und benutzen.
>
> ...weil in C alle Zeiger gleich groß sind - oder?

Jein :-)
Genau genommen gilt das nur für Datenzeiger. Zeiger auf Funktionen sind 
wieder eine eigene Kategorie. Aber dann weiß der Compiler aber auch, 
dass es sich um einen Funktionszeiger handelt. So gesehen kann man also 
'Ja' sagen. Der Compiler weiß immer wie groß ein Zeiger ist und wieviel 
Platz er daher reservieren muss. Die genau Strukturdefinition wird erst 
dann benötigt, wenn tatsächlich über den Zeiger auf die 
dahinterliegenden Daten zugegriffen werden soll.

von Bernhard N. (bernieserver)


Lesenswert?

Vielen Dank für die zahlreichen Antworten. Nachdem ich das schrieb ist 
mir das auch mit den anonymen typedefs klargeworden und werde mich davon 
aus Stilgründen auch verabschieden.

Gruß
Bernhard

von gagast (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> gagast schrieb:
>> ...weil in C alle Zeiger gleich groß sind - oder?
>
> Jein :-)
> Genau genommen gilt das nur für Datenzeiger. Zeiger auf Funktionen sind
> wieder eine eigene Kategorie. Aber dann weiß der Compiler aber auch,
> dass es sich um einen Funktionszeiger handelt. So gesehen kann man also
> 'Ja' sagen. Der Compiler weiß immer wie groß ein Zeiger ist und wieviel
> Platz er daher reservieren muss. Die genau Strukturdefinition wird erst
> dann benötigt, wenn tatsächlich über den Zeiger auf die
> dahinterliegenden Daten zugegriffen werden soll.

OK, die Funktionszeiger hatte ich jetzt vergessen, brauche ich so 
selten. Danke für die Bestätigung, vielleicht verstehe ich diese Sprache 
ja doch noch. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.