已定义结构体仍报‘解引用指向不完整类型struct tree_node’错误求助
问题根源:结构体标签大小写不匹配
你遇到的编译错误核心原因是C语言严格区分大小写,代码里的结构体定义存在名称不一致问题:
- 你定义的结构体标签是
struct Tree_Node(首字母大写T) - 但结构体内部的指针字段用的是
struct tree_node(首字母小写t)
编译器会把struct tree_node当作一个未定义的陌生结构体类型,自然会报“解引用指向不完整类型的指针”错误。
修复方案
两种简单的修复方式,选其一即可:
方式1:统一结构体标签为小写
把结构体定义的标签改成struct tree_node,内部指针保持不变:
#include <stdio.h> #include <stdlib.h> typedef struct tree_node { char *name; struct tree_node *parent; struct tree_node *first_child; struct tree_node *next_sibling; } tree_node; // 后续代码不变
方式2:内部指针使用大写的结构体标签
把结构体内部的指针类型改成struct Tree_Node *,和定义的标签一致:
#include <stdio.h> #include <stdlib.h> typedef struct Tree_Node { char *name; struct Tree_Node *parent; struct Tree_Node *first_child; struct Tree_Node *next_sibling; } tree_node; // 后续代码不变
额外问题:add_child函数逻辑错误
顺带修正一个运行时问题——你的add_child函数只是把局部变量cur赋值为child,并没有真正将child链接到树形结构里。正确写法应该是:
void add_child(tree_node *parent, tree_node *child) { // 先初始化子节点的关联字段 child->parent = parent; child->first_child = NULL; child->next_sibling = NULL; if (parent->first_child == NULL) { // 父节点无子女时,直接作为第一个子节点 parent->first_child = child; } else { tree_node *cur = parent->first_child; // 遍历到最后一个兄弟节点 while (cur->next_sibling != NULL) { cur = cur->next_sibling; } // 将新节点挂到最后 cur->next_sibling = child; } }
原代码里创建子节点时未初始化parent、first_child、next_sibling字段,加上上述初始化后,程序才能正确构建树形结构,避免运行时出现未定义行为。
内容的提问来源于stack exchange,提问作者K Man
相关产品推荐
相关产品推荐

