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

C语言结构体代码片段编译错误修复

报错原因拆解

三类编译错误的根因:

  • 首次编译的「字段为不完整类型」错误:在struct Person内部直接定义同类型的普通成员会触发递归包含,编译器计算结构体内存大小时会无限嵌套(mother成员内部还有mother/father,层层套娃没有终点),根本无法确定结构体需要分配的内存大小。关联同类型结构体的场景必须使用指针存储关联对象地址——指针本身的内存长度是固定的,不会触发无限大小计算的问题。
  • 改指针后报「应使用->运算符」错误:.运算符仅适用于访问结构体实例自身的成员,当成员是结构体指针时,要访问指针指向对象的成员,必须使用->运算符。
  • 改指针后报「类型不兼容」错误:指针变量存储的是内存地址,直接把结构体实例赋值给指针成员属于类型不匹配,需要用取地址符&拿到结构体实例的内存地址后再赋值。
修复后可正常编译运行的代码
#include <stdio.h>

struct Person {
    int age;
    char* name;
    // 改为结构体指针,解决递归包含的不完整类型错误
    struct Person* mother;
    struct Person* father;
};

void showPerson(struct Person p) {
    printf("Name: %s\nAge: %d\nFather: %s, Mother: %s\n",
          p.name, p.age, 
          // 指针类型成员用->访问指向内容的属性
          p.father->name, 
          p.mother->name); 
}

int main() {
    struct Person homer;
    struct Person marge;
    struct Person bart;

    homer.age = 36;
    homer.name = "Homer";
    // 无关联数据的指针置空,避免野指针
    homer.father = NULL;
    homer.mother = NULL;

    marge.age = 34;
    marge.name = "Marge";
    marge.father = NULL;
    marge.mother = NULL;

    bart.age = 10;
    bart.name = "Bart";
    // 给指针成员赋值需要传入实例的内存地址
    bart.mother = &marge;
    bart.father = &homer;

    showPerson(bart);
    return 0;
}
运行预期输出
Name: Bart
Age: 10
Father: Homer, Mother: Marge

内容的提问来源于stack exchange,提问作者Catty_cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:45:34