C语言链表初始化时末尾多出额外0值节点问题求助
链表初始化出现末尾多余0元素问题排查
抱歉我的英语水平有限,表述可能不够准确。
问题背景
- 项目需求:使用链表实现数字列表排序功能
- 自定义链表结构体定义:
typedef struct s_lst { int content; struct s_lst *next; } t_lst;
- 异常现象:传入整数列表完成链表初始化后,遍历预期内容为
1、2、3、4的链表时,实际输出为1-2-3-4-0,末尾多出一个值为0的额外元素;尝试在循环结束后将局部指针tmp赋值为NULL时直接触发段错误。 - 相关实现代码:
链表初始化函数stack_ini:
void stack_ini(t_lst **sa, char **nbr) { int i; t_lst *tmp; i = 0; tmp = *sa; while (nbr[i]) { tmp->content = ft_atoi(nbr[i]); tmp->next = malloc(sizeof(t_lst)); tmp = tmp->next; i++; } tmp->next = NULL; return ; }
链表打印函数print_list:
void print_list(t_lst *lst) { int i = 0; while (lst != NULL) { printf("%d Element in list : %d\n",i++, lst->content); lst= lst->next; } return ; }
问题根因
问题出在你的循环分配逻辑:
每处理一个数字时,你都会无条件为tmp->next申请一块新的节点内存。当处理完最后一个有效数字(比如测试用例里的4)时,你仍然多申请了一个空节点,随后把指针移到这个空节点上,最后只把这个空节点的next设为NULL,根本没给这个节点的content赋值。malloc申请到的内存如果不手动初始化,存储的值是不确定的,你这次运行刚好读到0,就出现了末尾多一个0元素的现象。
你之前尝试在循环结束后把tmp赋值为NULL会触发段错误,是因为tmp只是函数内部的局部指针变量,改它的值根本不会影响链表上任何节点的实际指向,这个操作本身对解决问题没有任何作用,触发段错误是你当时搭配了其他错误的内存操作导致的。
修复方案
调整节点分配逻辑:只有确认后面还有待存储的数字时,再申请新的节点内存;处理完最后一个数字后,直接把当前节点的next设为NULL标记链表结束,不要额外申请没用的空节点。
修复后的stack_ini代码如下(注意调用该函数前必须保证*sa已经成功分配了第一个节点的内存,否则会出现空指针访问):
void stack_ini(t_lst **sa, char **nbr) { int i; t_lst *tmp; i = 0; tmp = *sa; while (nbr[i]) { tmp->content = ft_atoi(nbr[i]); i++; // 后面还有数字要存,才分配下一个节点 if (nbr[i]) { tmp->next = malloc(sizeof(t_lst)); tmp = tmp->next; } else { // 没有后续数字,直接标记链表末尾 tmp->next = NULL; } } return ; }
内容的提问来源于stack exchange,提问作者Le-pouvz
相关产品推荐
相关产品推荐

