任何人都可以解釋c中單個鏈表的下列聲明之間的區別是什麼?更具體地說,爲什麼第一個不正確?如何在c中聲明單獨的鏈表?
typedef struct
{
char *data;
struct linkedlist *next;
} linkedlist;
VS
typedef struct linkedlist
{
char *data;
struct linkedlist *next;
} linkedlist;
任何人都可以解釋c中單個鏈表的下列聲明之間的區別是什麼?更具體地說,爲什麼第一個不正確?如何在c中聲明單獨的鏈表?
typedef struct
{
char *data;
struct linkedlist *next;
} linkedlist;
VS
typedef struct linkedlist
{
char *data;
struct linkedlist *next;
} linkedlist;
在第一種情況下,編譯達到
struct linkedlist *next;
,它不知道struct linkedlist
是什麼。
在第二種情況下,您在結構聲明開始處告訴它它是struct linkedlist
。當它遇到next
字段時,這使得編譯器很高興。
typedef struct
{
...
} linkedlist;
上面讓你能夠聲明變量如下:
linkedlist thisIsALinkedList;
但問題是,這僅僅是由編譯器在結構的結尾解析。因此,當它達到struct linkedlist *next
時,它不知道linkedlist
是什麼(即使它的確如此,聲明仍然不正確,因爲它應該只是linkedlist *next
)。
爲什麼編譯器(在我的情況下gcc)不會抱怨結構定義,但稍後給我一些錯誤? – kaspersky 2013-02-22 11:22:59
究竟是什麼錯誤? – 2013-02-22 11:23:22
一個錯誤是指令「while(tmp-> next-> next)」給我「取消引用不完整類型的指針」,其中tmp是一個「linkedlist *」 – kaspersky 2013-02-22 11:25:58