C语言实现自定义链表时遇不完整类型及语法类编译错误
编译报错根因定位
- *大小写敏感的拼写错误(引发最多报错的核心根源):C语言的类型名严格区分大小写,头文件中实际定义的结构体是
struct ElemSCL(最后一个字符为大写L),但typedef声明时写为struct ElemSCl(最后一个字符为小写l)。两个名称在编译器看来是完全无关的独立类型,因为找不到struct ElemSCl的实体定义,只会把它当成不完整的前置声明类型——既不知道它的内存大小,也不知道它包含哪些成员,直接触发所有“不完整类型”、“sizeof无效”的报错。 - *指针运算符优先级与逻辑错误:C语言中
->的运算符优先级远高于一元*解引用,代码中带外层*的指针访问语句存在两个问题:- 在
Addscl函数内部,scl是二级指针(Tipo**类型),要取它指向的节点指针访问成员,必须先对二级指针解引用,写为(*scl)->成员。多余的外层*会让编译器按照错误的优先级顺序解析代码,这就是编译器提示“‘*scl’ is a pointer; did you mean to use ‘->’”的原因。 - 在主函数内部,
scl已经是一级节点指针,->本身就完成了对节点的解引用操作,而info.value存储的是普通int整数值、不是指针,根本不需要额外加*做解引用。
- 在
- *函数作用域语法错误:main函数的右大括号位置错误,提前闭合了函数体,导致后续的
return 0;语句脱离了main的作用域,会触发额外的语法报错。
修正后的可运行代码
修正版 scl.h
#ifndef sclh #define sclh typedef struct{ int value; } listnote; // 基础链表节点结构体定义 struct ElemSCL { listnote info; struct ElemSCL* next; }; // 修正typedef的结构体名称拼写,和上方的结构体定义完全匹配 typedef struct ElemSCL Tipo; typedef Tipo *Mangiato; void Addscl(Mangiato* scl, int e); #endif
修正版 prove.c
#include "scl.h" #include<stdlib.h> #include<stdio.h> // 链表头插法新增节点 void Addscl (Mangiato *scl, int e) { Mangiato original_head = *scl; // 为新节点申请堆内存 *scl = (Tipo*) malloc(sizeof(Tipo)); // 先对二级指针解引用,再通过->访问节点成员 (*scl)->info.value = e; (*scl)->next = original_head; }
修正版 Main.c
#include<stdio.h> #include<stdlib.h> #include"scl.h" int main() { Tipo *scl = NULL; Addscl(&scl, 3); // 直接通过一级节点指针访问存储的值,去掉多余的解引用 printf("%d", scl->info.value); // 将return语句放回main函数作用域内部 return 0; }
编译运行说明
- 编译时需要将两个源文件共同参与链接,执行编译命令:
gcc Main.c prove.c -o scl_test - 运行生成的可执行文件即可正确输出结果
3
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

