用户链表嵌套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
相关产品推荐
相关产品推荐

