Проблема разыменования двойного указателя - PullRequest
5 голосов
/ 23 ноября 2011

Я бы хотел реализовать стек, используя связанный список.

Чтобы реализовать pop () для моего стека, я должен передать вызывающему объект двойной указатель (указатель на указатель), который (в конечном итоге) указывает на вершину моего стека (первая запись в связанном списке).

Причина, по которой я так поступаю, заключается в том, что таким образом вызывающая сторона может сохранять статический указатель на стек.

Структура элемента моего связанного списка:

struct Element {
int value;
struct Element *next;
};

pop () реализация:

int pop (struct Element **stack) {
    int popped_value = *stack->value;
    *stack = *stack->next;
    return popped_value;
}

Проблема, которую я имею, пытается разыменовать стек двойного указателя **. Этот код генерирует следующую ошибку:

error: request for member ‘value’ in something not a structure
error: request for member ‘next’ in something not a structure

По-моему, либо * stack-> value, либо ** stack.value должны работать для получения popped_value, но я получаю ту же ошибку.

Ответы [ 2 ]

10 голосов
/ 23 ноября 2011

-> имеет более высокий приоритет, чем оператор разыменования, так что это все равно что пытаться разыменовать stack->value, поскольку -> выполняется первым, а * - вторым. Вам необходимо использовать скобки:

int popped_value = (*stack)->value;
*stack = (*stack)->next;

Или, как предложил Уоллик в комментариях, разыменуйте аргумент, чтобы получить единственный указатель, и используйте его:

struct Element *sip = *stack;
int popped_value = sip->value;
*stack = sip->next;
8 голосов
/ 23 ноября 2011

-> имеет более высокий приоритет оператора , чем разыменование (*) в этой строке:

*stack->next

Вы говорите:

*(stack->next)

Что не получается, поскольку stack->next не имеет смысла.

Вы хотите:

(*stack)->next

вместо.

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