sepp2k уже дал правильный ответ.Поэтому я просто добавляю несколько полезных советов.
Одним из способов, который может помочь вам найти подобные проблемы в более крупных программах, является инструмент под названием valgrind.Например, если вы скомпилируете:
$ gcc -Wall -Wextra -g linked_stack.c -o linked_stack
и затем выполните:
$ valgrind ./linked_stack
Вы получите следующий вывод:
==1503== Invalid read of size 4
==1503== at 0x80484C6: pop (linked_stack.c:62)
==1503== by 0x8048584: main (linked_stack.c:79)
==1503== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==1503==
==1503== Process terminating with default action of signal 11 (SIGSEGV)
==1503== Access not within mapped region at address 0x0
==1503== at 0x80484C6: pop (linked_stack.c:62)
==1503== by 0x8048584: main (linked_stack.c:79)
Это эффективно говорит вамчто оператор в строке 62:
int data = stk->head->value;
пытается использовать недопустимый указатель со значением 0x0.В этот момент вам просто нужно отследить и выяснить, почему этот указатель недействителен.
Дополнительная информация, предоставляемая компиляцией с -g
для символов отладки и последующим запуском в valgrind, действительно может помочь вам отследить этивиды проблем в больших программах.