2010-11-04 119 views

回答

10

當創建一個自引用的數據類型,則需要使用指針來解決圓的問題:

struct node; 

struct node { 
    struct node * next; 
    int id; 
} 

...應該工作,但在使用時請注意正確分配內存。

爲什麼一個指針?考慮一下:struct定義的要點是,編譯器可以計算出分配多少內存以及當您說node.id時要訪問哪些部分。如果你的node結構體包含另一個node結構體,那麼編譯器爲給定的node分配多少內存?

通過使用指針可以解決這個問題,因爲編譯器知道需要爲指針分配多少空間。

0

的問題是,當編譯器到達該行:

struct node{ 
    struct node next; /* << this line */ 

編譯器居然不知道什麼是struct node,因爲你定義struct node

通常,您不能使用未定義或不完整的類型。

+0

事實上,編譯器* *知道已經。真正的問題是'struct'由於自我指向性而具有無限大小。解決方案是使用一個指針('struct node * next')。;-) – 2012-12-26 22:09:56

2
  1. 你需要做節點的正向聲明,因爲編譯器不知道node然而,儘管它的處理它的定義。
  2. 你可能是想要存儲一個指針,而不是一個節點對象本身。

試試這個:

struct node; 

struct node{ 
    struct node *next; 
    int id; 
}; 
+0

前向聲明不需要,因爲結構的聲明作爲它自己的前向聲明。這個問題完全是他試圖把一個結構放在它自己內部,並且應該使用一個指針。 – JeremyP 2010-11-04 10:16:16

1

不完整類型的某些用法不合格,例如當您嘗試聲明不完整類型的對象時。但是,您可以聲明指向不完整類型的指針(例如)。在這種情況下,這只是這裏需要什麼:

struct node{ 
    struct node *next; 
    int id; 
}; 
5

如果一個struct 可能包含自己的類型的另一個實例,它的規模將是無限的。

這就是爲什麼它只能包含一個指針到它自己的類型。

此外,在代碼中的這一點,結構的大小是未知的,所以編譯器不知道預留多少空間。

0

爲了工作,你應該寫:

typedef struct _node{ 
    struct _node* next; 
    int   id; 
}node; 
+0

以下劃線開頭的標識符保留用於執行 – Flexo 2011-09-14 13:32:15

+0

awoodland:只有下劃線+大寫字母或雙下劃線。 – u0b34a0f6ae 2011-12-14 16:07:03