2013-06-08 37 views
6

jest to prawdopodobnie bardzo proste, ale jak mogę uzyskać struct x, aby być w struct x w C? Tak więc na przykład:Struct X w Struct X?

typedef struct _Node { 
    Node node; 
} Node; 

Robiłem rozeznanie i próbował za pomocą wskaźników, takich jak to:

typedef struct _Node { 
    struct Node *node; 
} Node; 

Mimo że pozostawia zmienną węzeł jako wskaźnik, który nie chce, ja po prostu chcę, żeby była instancją struktury węzła. Dzięki za pomoc. :)

EDIT:

Zasadniczo co usiłuję zrobić to:

Node current = createNode(...); 
while (true) { 
    Node node = createNode(..., &current); 
    addToList(node); 
    current = somethingElse(); 
} 

Jak można sobie wyobrazić, chcę regularny węzeł iść do createNode function():

Node createNode(..., Node node) {} 
+14

Nie możesz tego zrobić. Aby zrozumieć rekursję, musisz najpierw zrozumieć rekursję. – DCoder

+0

@DCoder Więc jaka byłaby idealna praca dookoła? –

+4

Użyj wskaźników, takich jak to, co znalazłeś w swoich badaniach –

Odpowiedz

3

To nie jest możliwe. Ponieważ to jest pod niepełnym typem. Nie struct Node wewnątrz struct Node wewnątrz struct Node ... i tak dalej .... To sprawia, że ​​twoja pierwotna struktura jest niekompletna. Stąd niepełna definicja typu.

Powód jest taki.

  1. Aby pole znajdowało się wewnątrz struktury, musi być znanym typem.
  2. Ale do czasu, gdy widzimy struct Node wewnątrz struct Node{}, nie jest jeszcze określony.
  3. Jest określany dopiero po zeskanowaniu całej definicji struct Node{}, ale jest to możliwe tylko po zapoznaniu się z typem struct Node, który prowadzi do paradox.

Ale sprawa jest inna, jeśli podasz struct Node *.

  1. Po dotarciu do struct Node * wiadomo, że jest to typ wskaźnika. To wymaga stałej ilości pamięci bez względu na typ wskaźnika.
  2. Tak więc pomyślnie skanuje i kończy definicję struct Node{}. Dlatego jest to kompletny typ.
8
typedef struct node { 
    struct node node; 
} node_s; 

prowadziłoby to do "nieskończonej rekurencji". Innymi słowy, jego rozmiar byłby nieskończony. Kompilator nie może odpowiedzieć na to pytanie: Ile pamięci można przydzielić? Dlatego wyświetli komunikat diagnostyczny.

Dlatego należy używać wskaźników do tworzenia typów samo-referencyjnych.

typedef struct node { 
    struct node *node; 
} node_s; 

Nawiasem mówiąc, identyfikatory zaczynające się od znaku podkreślenia następnie znaku podkreślenia lub litery są zarezerwowane do wykonania.