Я пытаюсь реализовать стек, используя связанный список.Мой конструктор стека createStack()
создает пустой (фиктивный) Element
и возвращает двойной указатель на этот элемент (начало стека).Мой метод push()
проверяет наличие в стеке фиктивного элемента;если он это делает, он заполняет пустышку и возвращает, в противном случае он выделяет память для нового элемента и выполняет необходимые обновления указателя.
Проблема, с которой я столкнулся, заключается в том, что мой указатель *stack->next
явно указывает на NULL (0x0)
, поскольку ондолжен, а затем через две строки он не равен NULL (0x17)
, но каким-то образом проходит тест NULL
.Внутри вызова push он снова равен (0x17)
, но на этот раз он не проходит тест NULL
, как и должно быть.
Итак, мой вопрос, что, черт возьми, происходит с этим указателем?Как / почему он изменился с (0x0)
на (0x17)
, и если он равен (0x17)
, как прошел тест ==NULL
??
//main.c
int main () {
struct Element **stack;
stack = createStack();
printf("stack: %p\n", stack );
printf("*stack->next: %p\n", (*stack)->next );
if ( (*stack)->next == NULL )
printf("yes the pointer is null\n" );
printf("*stack->next: %p\n", (*stack)->next );
if ( (*stack)->next == NULL )
printf("yes the pointer is null\n" );
push ( stack, 1000 );
//stack.c
struct Element {
int value;
struct Element *next;
};
int push ( struct Element **stack, int el ) {
if ( (*stack)->next == NULL) {
// first element, fill dummy element and return
printf("first value: %i !", el);
(*stack)->value = el;
return 1;
}
printf("the pointer is not null\n");
struct Element *newElement = malloc( sizeof( struct Element ) );
if ( !newElement )
return -1;
newElement->value = el;
//add element to front of list
newElement->next = *stack;
//update pointer to new first element
*stack = newElement;
return 1;
}
struct Element** createStack() {
struct Element *dummy = malloc( sizeof( struct Element ) );
if (dummy == NULL )
printf("malloc failed...");
dummy->value = 99;
dummy->next = NULL;
struct Element **stack;
stack = &dummy;
return stack;
}
Приведенный выше код дает следующий вывод:
stack: 0x7fff6c385ba8
*stack->next: 0x0
yes the pointer is null
*stack->next: 0x17
yes the pointer is null
the pointer is not null