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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:57:26