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

