C语言开发组织管理软件调用addAccount函数出现segmentation fault错误求助
段错误原因排查
- 传参逻辑错误(核心触发原因)
C语言默认采用值传递,你当前addAccount函数的head、tail、accounts都是指针值传递,函数内部修改这三个指针的指向不会同步到函数外的实参:- 初始状态下如果
head和tail均为NULL,满足head == tail的判断分支,此时如果传入的accounts是未初始化的野指针/NULL,直接访问accounts->id会直接触发段错误 - 非初始状态下你修改了局部变量
tail = a,但函数外的实参tail完全没有变化,后续调用时链表逻辑完全混乱,访问非法内存触发段错误 - 原代码初始分支重复对
accounts->id赋值1,属于冗余代码,虽然不会触发段错误但建议删除
- 初始状态下如果
- 链表节点关联逻辑缺失
非初始分支中,你仅设置了新节点a的prev指向原尾节点,但没有给原尾节点的next赋值为a,链表关联断裂,后续遍历链表时会访问野指针 - 潜在风险点(也可能触发段错误)
malloc未做返回值校验,如果内存分配失败返回NULL,后续访问a->name等成员会直接触发段错误scanf("%s", accounts->name)没有限制输入长度,输入超过199字符时会发生缓冲区溢出,覆盖栈上其他内存数据,也可能触发段错误
修复方案
建议调整函数参数为二级指针,保证指针修改可以同步到外部实参,同时统一节点创建逻辑,修复后的代码示例如下:
struct account { char name[200]; int id; struct account* next; struct account* prev; }; void addAccount(struct account** head, struct account** tail) { struct account* a = (struct account*)malloc(sizeof(struct account)); if (a == NULL) { p("Memory allocation failed"); return; } p("Enter name"); // 限制输入长度避免缓冲区溢出 scanf("%199s", a->name); if (*head == NULL && *tail == NULL) { // 空链表添加第一个节点 a->id = 1; a->next = NULL; a->prev = NULL; *head = a; *tail = a; } else { a->id = (*tail)->id + 1; a->next = NULL; a->prev = *tail; (*tail)->next = a; *tail = a; } p("Account added"); }
调用时传入head和tail的地址即可:addAccount(&head, &tail);
内容的提问来源于stack exchange,提问作者Manav Sethi
相关产品推荐
相关产品推荐

