You need to enable JavaScript to run this app. C语言嵌套链表查询函数acces_num无法正确返回prec指针求助
优惠活动
大模型
产品
解决方案
定价
更多

C语言嵌套链表查询函数acces_num无法正确返回prec指针求助

问题根源

C语言采用值传递逻辑,你当前函数的prec参数是一级指针,传参时只会复制指针的值,函数内部对prec的赋值仅会修改局部副本,完全不会同步到函数外部的变量,导致外部拿到的prec是未初始化的野指针,访问时就会出现程序崩溃、阻塞退出的问题。
另外当前逻辑还遗漏了匹配节点是头节点的场景:如果第一个节点就匹配成功,prec完全没有被赋值,本身就是非法值。

修正方案

将prec参数改为二级指针,通过间接赋值把前驱节点地址回传到函数外部。

修正后的函数代码

// 第三个参数改为二级指针,用于输出前驱节点地址
liste_fav *acces_num(abonnes *p, signed char *num, liste_fav **prec)
{
    liste_fav *point = &(p->liste);
    boolean trouv = false;

    // 先初始化前驱为NULL,处理头节点匹配的场景
    if (prec != NULL) {
        *prec = NULL;
    }

    while ((point != NULL) && (trouv == false))
    {
        if (strncmp(num, numero_fav_propre(point), 20) == 0) {
            trouv = true;
        } else {
            // 通过二级指针修改外部的前驱变量
            if (prec != NULL) {
                *prec = point;
            }
            point = suivant_fav_propre(point);
        }
    }

    return trouv ? point : NULL;
}

调用示例

// 外部定义前驱节点指针
liste_fav *prec = NULL;
// 调用时传prec的地址作为第三个参数
liste_fav *matched_node = acces_num(your_abonnes_ptr, target_num, &prec);

// 后续可直接使用matched_node和prec做删除、修改操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 17:45:06