C语言链表末尾追加结构体节点出现段错误,求解决方法
链表追加节点段错误的排查与修复
你的代码出现段错误主要是append函数存在两处关键逻辑错误,下面逐一分析并给出修复方案:
错误点分析
无效覆盖传入节点+非法内存拷贝
在append函数中,你重新调用malloc给参数i分配内存,直接丢弃了main函数里create_item创建好的节点;同时执行的strcpy(i->name, i->name)是将未初始化的内存内容拷贝到自身,完全无意义,还会导致数据异常。空链表场景下的空指针访问
当链表初始为NULL时,你设置*list = i后没有终止函数,继续执行while(last->next != NULL)——此时last是NULL(因为last = *list是在if判断前执行的,当时*list还是NULL),访问last->next直接触发段错误。
修复后的代码
修正后的append函数
void append(struct item **list, struct item *i){ // 确保新节点的next指针为NULL(create_item已经做了这一步,这里可作为双重保障) i->next = NULL; // 空链表直接将新节点设为头节点 if(*list == NULL){ *list = i; return; // 处理完空链表后直接返回,避免后续逻辑执行 } // 非空链表,遍历找到最后一个节点 struct item *last = *list; while(last->next != NULL) { last = last->next; } // 将新节点追加到末尾 last->next = i; }
完整可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> struct item { char name[32]; struct item *next; }; struct item *create_item(char *name) { struct item *result = malloc(sizeof(struct item)); strcpy(result->name, name); result->next = NULL; return result; } int equals(char *a, char *b) { return strcmp(a, b) == 0; } void append(struct item **list, struct item *i){ i->next = NULL; if(*list == NULL){ *list = i; return; } struct item *last = *list; while(last->next != NULL) { last = last->next; } last->next = i; } int main(void) { struct item *list = NULL; append(&list, create_item("Dog")); append(&list, create_item("Cat")); append(&list, create_item("Bat")); assert(equals(list->next->next->name, "Bat")); printf("断言通过,链表追加正常\n"); // 释放内存,避免内存泄漏 struct item *temp; while(list != NULL){ temp = list; list = list->next; free(temp); } return 0; }
额外说明
- 修复后的代码让
create_item负责创建并初始化节点,append专注于节点追加逻辑,职责划分更清晰。 - 新增内存释放代码,避免程序结束后出现内存泄漏问题。
内容的提问来源于stack exchange,提问作者Yasmin
相关产品推荐
相关产品推荐

