C: ошибки в связанном списке. в то время как условие не в состоянии оценить, чтобы проверить NULL - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь проверить связанный список на наличие дублирующихся значений в списке, но по какой-то причине я получаю ошибку segfault.

Это функция, которую я написал для проверки на наличие дублирующих номеров:

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))

В то время как l oop в моем dup_checker не может получить нулевой указатель. Я даже использовал и если заявление, чтобы проверить, но все еще не удается. Оператор if:

if (stack != NULL)

Это моя функция для pu sh нового значения в стеке:

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, чтобы найти проблему, но безуспешно.

Ранее я писал этот код на Машина MA C, и она работала без проблем, но сейчас я использую Ubuntu и у меня есть эта проблема. Какие-нибудь решения?

1 Ответ

0 голосов
/ 27 апреля 2020

относительно:

t_stack *stack_a;

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

Указатель переменной: stack_a не был инициализирован, поэтому содержит то, что когда-либо tra sh находится в стеке программ в этом месте. Чтобы исправить, предложите заменить:

t_stack *stack_a;

на

t_stack *stack_a = NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...