Struct mit Zeiger auf seinen eigenen Datentyp

OP #2198174
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
Gast #2198197
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
#2198231
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.
Gast #2198352
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?
#2198356
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.
Gast #2202621
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. :-)

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