【问题标题】:C: linked list segfaults. while conditon fail to evaulate to check for NULLC:链表段错误。 while 条件无法评估以检查 NULL
【发布时间】:2020-08-09 22:11:46
【问题描述】:

我正在尝试检查链表中是否存在重复值,但由于某种原因,我不断收到段错误。

这是我写的检查重复数字的函数:

void        dup_checker(t_stack *stack, int value)
{
    int counter;

    counter = 0;
    while (stack)
    {
        if ((stack->elem == value) && (counter < 3))
            counter++;
        if (counter == 2)
            error_msg();
        stack = stack->next;
    }
}

程序在这一行失败:

if ((stack->elem == value) && (counter < 3))

我的 dup_checker 中的 while 循环无法获取 NULL 指针。我什至使用 and if 语句进行检查,但仍然失败。 if 语句:

if (stack != NULL)

这是我将新值压入堆栈的函数:

void    push(t_stack **curr, const char *elem)
{
    t_stack         *new;
    int             value;

    digit_checker(elem);
    value = ft_atoi(elem);
    if (!(new = (t_stack *)malloc(sizeof(t_stack))))
        return ;
    new->elem = value;
    new->next = (*curr);
    new->index = 1;
    (*curr) = new;
    dup_checker((*curr), value);
}

这是我的主要功能:

int     main(int ac, char **av)
{
    t_stack *stack_a;
    t_stack *stack_b;

    if (ac > 1)
    {
        ac--;
        stack_b = NULL;
        while (ac > 0)
            push(&stack_a, av[ac--]);
        //normalizer(&stack_a);
        //check_args(&stack_a, &stack_b);
        //is_sorted(stack_a, stack_b);
    }
    return (0);
}

我使用了调试器,这是我得到的结果:

Program received signal SIGSEGV, Segmentation fault.
0x0000555555555a96 in dup_checker (stack=0xe48348e289485ed1, value=2) at sorter.c:57
57          if ((stack->elem == value) && (counter < 3))

我也使用 valgrind 来查找问题,但没有成功。

我之前在 MAC 机器上编写了这段代码,它没有问题,但我现在使用的是 Ubuntu,并且遇到了这个问题。有什么解决办法吗?

【问题讨论】:

  • 你是否真的打印了stack,看看它是否真的是NULL(我怀疑)?
  • t_stack *stack_a; ==> t_stack *stack_a = NULL; stack_a 中没有确定的值。因此,在您的推送中,执行new-&gt;next = (*curr); 的初始节点插入将一个不确定的值保存为堆栈的尾指针。
  • @WhozCraig 非常感谢!!解决了它。我没有意识到我仍然必须将堆栈初始化为 NULL,即使我正在使用一个值对其进行初始化。

标签: c linked-list segmentation-fault


【解决方案1】:

关于:

t_stack *stack_a;

if (ac > 1)
{
    ac--;
    while (ac > 0)
        push(&stack_a, av[ac--]);

变量指针:stack_a 尚未初始化,因此包含该位置的程序堆栈上的垃圾。要修复,建议更换:

t_stack *stack_a;

t_stack *stack_a = NULL;

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多