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
相关产品推荐
相关产品推荐

