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

用户链表嵌套local链表后访问触发段错误 技术求助

问题分析与解决方案

首先,我一眼就揪出了导致段错误的核心问题:你把结构体里的链表指针成员名写错了,这直接导致程序访问了错误的内存区域,最终触发崩溃。

1. 核心错误:结构体成员名不匹配

先看你的结构体定义:

typedef struct local{ int id; char *name; int popl; struct local *prox; }t_local;
typedef struct pdi{ char *name; char *descript; char *schedule; int id; int popp; int hotpoints; struct pdi *prox; }t_pdi;

两个链表结构体的指针成员都叫prox,但在代码逻辑里,你全程用了next来访问这个成员:

  • 遍历local链表时:tempnodel = tempnodel->next;
  • 添加local节点时:new1L->next = nodelocal->next;、nodelocal->next = new1L;
  • 遍历pdi链表时:tempnodepdi = tempnodepdi->next;
  • 添加pdi节点时:new1PDI->next = nodepdi->next;、nodepdi->next = new1PDI;

因为结构体里根本没有next这个成员,程序会错误地读写结构体之后的未知内存——在crialistapessoas函数里可能暂时没触发崩溃,但当你把这个错误的链表指针存入t_person节点后,后续访问时必然会因为指针指向非法内存而触发段错误。

2. 次要问题:需要修正的细节

除了上面的核心错误,还有两个小问题需要修复,避免后续出现其他异常:

  • insertpersonlist函数缺少返回值:函数声明返回t_person *,但末尾没有return语句,这会导致未定义行为。可以根据需求返回header_p或者new1。
  • 内存泄漏问题:你一开始给name、address、dob分配了内存,但之后直接用strtok的结果覆盖了这些指针,导致初始分配的内存无法释放。虽然insertpersonlist里用strdup复制了内容不影响功能,但最好还是修正。

修复后的关键代码片段

修正链表成员访问

把所有next替换成prox,比如:

// 遍历local链表的修正
while(tempnodel!=NULL && tempnodel->id != tempid){
    tempnodel = tempnodel->prox;
}
// 添加local节点的修正
new1L->prox = nodelocal->prox;
nodelocal->prox = new1L;

// 遍历pdi链表的修正
while(tempnodepdi!=NULL && tempnodepdi->id != tempid){
    tempnodepdi = tempnodepdi->prox;
}
// 添加pdi节点的修正
new1PDI->prox = nodepdi->prox;
nodepdi->prox = new1PDI;

修正insertpersonlist的返回值

在函数末尾添加返回语句:

t_person *insertpersonlist(t_person *header_p, char *name, char *address, char *dob, int phonenumber, t_local *listlocals, t_pdi *listpdis){
    // 原代码逻辑...
    node->next = new1;
    return header_p; // 添加返回语句
}

修正内存泄漏(可选但推荐)

去掉提前给name、address、dob的malloc,直接声明指针即可:

// 去掉这三行多余的malloc
// char *name = malloc(200*sizeof(char));
// char *address = malloc(200*sizeof(char));
// char *dob = malloc(200*sizeof(char));

char *name;
char *address;
char *dob;

验证修复效果

修正这些问题后,你的local链表就能正确被存储到用户链表中,后续访问时也不会触发段错误了。测试时可以打印链表节点信息,确认每个节点的指针都正确指向了下一个节点。

内容的提问来源于stack exchange,提问作者João Teixeira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:44:14