C语言中创建自引用结构体的实现方式有效性咨询
C语言中创建自引用结构体的实现方式有效性咨询
你采用的这个方案是完全有效且标准的C语言自引用结构体实现方式,完全不用担心会有明显的问题,反而这就是处理这类场景的常规做法。
先说说你第一种写法为什么会报错:
typedef struct {
int data;
Node *next;
} Node;
在这个定义里,当编译器处理到Node *next的时候,Node这个类型别名还没有被定义出来(因为typedef要到整个结构体定义结束后才会生效),所以编译器根本不知道Node是什么,自然会报编译错误。
而你用的第二种写法:
typedef struct Node_s { int data; struct Node_s *next; } Node_t;
这里的核心逻辑是:
- 首先声明了一个名为
struct Node_s的结构体类型,在结构体内部引用struct Node_s *next的时候,编译器已经知道struct Node_s是一个结构体类型了(哪怕它还没完全定义完,C语言允许这种“不完全类型”的引用,因为指针的大小是固定的,编译器不需要知道结构体的完整大小就能处理指针)。 - 之后通过
typedef把struct Node_s别名为Node_t,后续你就可以用Node_t来代替struct Node_s使用,非常方便。
这种写法不仅合法,而且是C语言里实现链表这类自引用数据结构的标准范式,很多教材和实际项目里都是这么写的。你完全可以放心使用。
备注:内容来源于stack exchange,提问作者h0ax
相关产品推荐
相关产品推荐

