回答
當創建一個自引用的數據類型,則需要使用指針來解決圓的問題:
struct node;
struct node {
struct node * next;
int id;
}
...應該工作,但在使用時請注意正確分配內存。
爲什麼一個指針?考慮一下:struct
定義的要點是,編譯器可以計算出分配多少內存以及當您說node.id
時要訪問哪些部分。如果你的node
結構體包含另一個node
結構體,那麼編譯器爲給定的node
分配多少內存?
通過使用指針可以解決這個問題,因爲編譯器知道需要爲指針分配多少空間。
的問題是,當編譯器到達該行:
struct node{
struct node next; /* << this line */
編譯器居然不知道什麼是struct node
,因爲你定義struct node
。
通常,您不能使用未定義或不完整的類型。
- 你需要做節點的正向聲明,因爲編譯器不知道
node
然而,儘管它的處理它的定義。 - 你可能是想要存儲一個指針,而不是一個節點對象本身。
試試這個:
struct node;
struct node{
struct node *next;
int id;
};
前向聲明不需要,因爲結構的聲明作爲它自己的前向聲明。這個問題完全是他試圖把一個結構放在它自己內部,並且應該使用一個指針。 – JeremyP 2010-11-04 10:16:16
不完整類型的某些用法不合格,例如當您嘗試聲明不完整類型的對象時。但是,您可以聲明指向不完整類型的指針(例如)。在這種情況下,這只是這裏需要什麼:
struct node{
struct node *next;
int id;
};
如果一個struct 可能包含自己的類型的另一個實例,它的規模將是無限的。
這就是爲什麼它只能包含一個指針到它自己的類型。
此外,在代碼中的這一點,結構的大小是未知的,所以編譯器不知道預留多少空間。
爲了工作,你應該寫:
typedef struct _node{
struct _node* next;
int id;
}node;
以下劃線開頭的標識符保留用於執行 – Flexo 2011-09-14 13:32:15
awoodland:只有下劃線+大寫字母或雙下劃線。 – u0b34a0f6ae 2011-12-14 16:07:03
- 1. C++這是一個不完整類型?
- 2. 取消引用指向不完整類型的指針'struct pt_regs'
- 3. 'sizeof'對不完整類型'struct ether_arp'的無效應用
- 4. C++ struct不會命名一個類型
- 5. C結構體的不完整類型
- 6. 參數有不完整的類型
- 7. yacc - 字段有不完整的類型
- 8. typedef和不完整的類型
- 9. 錯誤:數組類型具有不完整的元素類型
- 10. 錯誤:OpenSSL 1.1.0中的「使用不完整類型」RSA {aka struct rsa_st}「
- 11. 不同類型的struct
- 12. 「不完整類型不允許」錯誤
- 13. 一個不完整類型的非共享智能指針
- 14. 如何使用不完整的類型
- 15. 擴展'不完整'類型(SWIG)
- 16. 不完整的類型元素[2] []
- 17. std :: pair抱怨不完整的類型
- 18. 錯誤:字段有不完整類型
- 19. DescribeStreamOutcome報告爲「不完整類型」
- 20. 字段有不完整的類型C++
- 21. C++中的不完整類型
- 22. Akka完整參數類型
- 23. 成員訪問到不完整類型錯誤
- 24. C編程:參數有不完整的類型錯誤
- 25. 編譯錯誤 - 語法錯誤,並且不完整的類型
- 26. 錯誤:取消引用指向不完整類型的指針
- 27. Ç的typedef:參數具有不完整的類型
- 28. C錯誤:取消引用指向不完整類型
- 29. SFINAE與std :: enable_if和std :: is_default_constructible在libC++中的不完整類型
- 30. C:解除指向不完整類型錯誤的指針
事實上,編譯器* *知道已經。真正的問題是'struct'由於自我指向性而具有無限大小。解決方案是使用一個指針('struct node * next')。;-) – 2012-12-26 22:09:56