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

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编译器)

按以下步骤修改代码:

  1. 将InitList的形参从引用改为指针类型,函数内部访问成员时改用->操作符
  2. 删除无用的后置函数声明,或者将声明挪到函数实现之前
  3. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:54:00