prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 1.14

Q我似乎无法成功定义一个链表。我试过

	typedef struct {
		char *item;
		NODEPTR next;
	} *NODEPTR;
但编译器给出了错误消息。C 中的结构不能包含指向自身的指针吗?


AC 中的结构体确实可以包含指向自身的指针;K&R 第 6.5 节的讨论和示例对此说得很清楚。

这个例子中的问题在于 typedef。typedef 为类型定义了一个新名称,在更简单的情况下 [脚注],你可以同时定义一个新的结构体类型和它的 typedef,但在这种情况下不行。typedef 声明在定义之前是不能使用的,而在上面的片段中,它在声明next字段时还没有定义。

要修复这段代码,首先给结构体一个标签(例如,“struct node”)。然后,将字段声明为简单的nextstruct node *,或者将 typedef 声明与结构体定义分开,或者两者都做。一个修正后的版本是你也可以在 struct 声明前加上 typedef,在这种情况下,你就可以在声明

	typedef struct node {
		char *item;
		struct node *next;
	} *NODEPTR;
NODEPTR类型时使用这个 typedef,因为此时字段已经声明完毕next,毕竟
	typedef struct node *NODEPTR;

	struct node {
		char *item;
		NODEPTR next;
	};
(在这种情况下,你声明了一个包含struct node的新 typedef 名称,尽管struct node尚未完全定义;这是允许的。[脚注]

最后,这是一个结合了两个建议的重排版本

	struct node {
		char *item;
		struct node *next;
	};

	typedef struct node *NODEPTR;

(选择哪种方法是风格问题;参见第 17 节。)

另请参见问题 1.152.1

参考文献:K&R1 第 6.5 节 p. 101
K&R2 第 6.5 节 p. 139
ISO 第 6.5.2 节、第 6.5.2.3 节
H&S 第 5.6.1 节 pp. 132-3


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管