C语言结构体作为函数参数时编译出现&符号相关错误
错误原因
- 核心语法不兼容:C语言标准不支持引用传递(即形参里的
&写法),该语法是C独有的特性,你用C编译器编译包含C语法的代码,就会在&字符位置抛出语法错误。 - 函数声明顺序错误:
InitList的函数声明写在了函数实现的后面,编译器在处理到main里的InitList调用时找不到合法的函数声明,就会触发隐式声明的警告。 - 传参与形参类型不匹配:你定义的
InitList形参是引用类型,但main里调用时传的是&L也就是LinkList*指针类型,类型完全不匹配。 - 代码逻辑小问题:
NewNode函数里先给p->next赋值再判断p是否为NULL,一旦malloc失败返回NULL会直接触发段错误。
解决方法
方案1:用C++编译
直接将源文件后缀从.c改为.cpp,使用g++编译器编译即可,不需要修改核心代码逻辑。
方案2:修改为纯C语法(推荐,适配C编译器)
按以下步骤修改代码:
- 将
InitList的形参从引用改为指针类型,函数内部访问成员时改用->操作符 - 删除无用的后置函数声明,或者将声明挪到函数实现之前
- 调整
NewNode里的空指针判断顺序,避免段错误
修改后的完整代码如下:
#include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode* next; }*Link, *Position; typedef struct LinkList { Link head,tail; int len ; }LinkList; struct LNode* NewNode() { struct LNode* p; p = (struct LNode*)malloc(sizeof(struct LNode)); // 先判断空指针再操作成员 if (p == NULL) exit(-1); p->next=NULL; return p; } // 形参改为指针类型 void InitList(LinkList *L) { Link p=NewNode(); // 用->访问指针指向的结构体成员 L->head = L->tail = p; L->len = 0; } int main() { int M,i; LinkList L; InitList(&L); return 0; }
内容的提问来源于stack exchange,提问作者Spider
相关产品推荐
相关产品推荐

