任何人都可以解释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