Вам необходимо использовать двойной указатель в аргументах вашей функции:
// Add a new value to the top of the stack
void push(element **s, const int x);
// Print the stack
void print(const element *s);
// Try removing the top element of the stack and returning it
int pop(element **s);
Затем вы вызываете push
и pop
со ссылкой на указатель стека:
push(&stack, x);
pop(&stack);
Затем, если вы хотите изменить указатель на стек, вы разыменовываете s
один раз: *s = newElement
, но если вы хотите получить значение верхнего элемента, вы разыменовываете его дважды: const int num = (*s)->num;
.
Причина, по которой это необходимо сделать, заключается в том, что когда вы передаете указатель на стек в функцию, эта функция получает копию указателя. Этот новый указатель ссылается на тот же стек, поэтому изменение значений в стеке будет работать, но изменение самого указателя ничего не будет делать вне функции.
Если вместо этого вы используете указатель на указатель на ваш стек, то вы разрешаете модифицировать этот второй указатель, поскольку только указатель верхнего уровня является копией.