You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已定义结构体仍报‘解引用指向不完整类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:52:47