Двойной указатель C для списка - PullRequest
1 голос
/ 19 января 2020

Короткое время go Я начал учиться c. Когда я попробовал список кодирования, я написал функцию с двойным указателем, потому что я видел это в другом ресурсе, затем я сам закончил писать эту функцию, и она не работает, пожалуйста, помогите мне и объясните, как это работает.

void
push(v_stack_t ** node, int num_args, ...)
{

    va_list ap;
    v_stack_t **current = node;

    va_start(ap, num_args);
    for (int i = 0; i < num_args; i++) {
        v_stack_t *new_node = (v_stack_t *) malloc(sizeof(v_stack_t));
        new_node->value = va_arg(ap, int);

        if (*current == NULL) {
            *current = new_node;
            continue;
        }
        while ((*current)->next != NULL) {
            current = &(*current)->next;
        }
        (*current)->next = new_node;
    }
    va_end(ap);
}

Ответы [ 2 ]

1 голос
/ 19 января 2020

Как упоминалось 1201ProgramAlarm , вам нужно установить next на NULL.

Но, поскольку вы используете current, его окончательное значение никогда не передается обратно вызывающей стороне ( например, вам нужно установить *node в конце).

Ваш внутренний while l oop может быть перемещен выше вашего внешнего l oop.

И это намного проще разыменовать node в начале и использовать одиночные косвенные указатели для основной части функции. Примечание: head более наглядно описывает функцию, чем node здесь.

Вот переделка вашего кода:

void
push(v_stack_t **head, int num_args, ...)
{
    va_list ap;
    v_stack_t *tail;

    // find last element of list
    tail = NULL;
    for (v_stack_t *cur = *head;  cur != NULL;  cur = cur->next)
        tail = cur;

    va_start(ap, num_args);
    for (int i = 0; i < num_args; i++) {
        v_stack_t *new_node = malloc(sizeof(v_stack_t));

        new_node->value = va_arg(ap, int);
        new_node->next = NULL;

        // append to tail of list
        if (tail != NULL)
            tail->next = new_node;

        // add node at head of list
        else
            *head = new_node;

        // set new element as tail of list
        tail = new_node;
    }
    va_end(ap);
}
1 голос
/ 19 января 2020

Вы не показали нам определение для v_stack_t, но вы не инициализируете все элементы этой структуры после того, как выделите один. new_node->next будет иметь некоторое неизвестное значение (вероятно, не NULL), вызывая проблемы при попытке добавить второй узел. Вы должны установить

new_node->next = NULL;

сразу после оператора malloc.

Не имеет значения, вам не нужно приводить возвращаемое значение из malloc.

...