Как говорят другие, вы должны использовать fprintf(stderr,...)
для печати отладочных сообщений.
Вы можете использовать gdb, чтобы увидеть, в чем проблема, и посмотреть, что происходит в памяти. Добавьте флаг -g
при компиляции, чтобы помочь с отладкой в gdb.
Это вывод, который GDB дал мне:
(gdb) r
Starting program: .../test
Pushing:
1 2
2
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400873 in Push (X=1, S=0x601010) at stackli.c:81
81 temp->Next = S->ThisStack->Next;
(gdb) bt
#0 0x0000000000400873 in Push (X=1, S=0x601010) at stackli.c:81
#1 0x0000000000400627 in main () at testprob2.c:20
(gdb) print temp
$1 = (PtrToNode) 0x601110
(gdb) print S->ThisStack
$2 = (PtrToNode) 0x0
Ошибка возникает в void Push( ElementType X, Stack S )
.
Как вы можете видеть, когда мы распечатываем S->ThisStack
, мы получаем 0x0
, т.е. S->ThisStack
указывает на NULL
. Когда вы разыменовываете S->ThisStack
, чтобы добраться до S->ThisStack->Next
, вы получаете ошибку сегментации.
Вы можете добавить чек на if (S->ThisStack == NULL)
. Я не совсем уверен в том, как вы собираетесь создавать структуру стека.
Также обратите внимание, что это только одна проблема с вашим кодом, потенциально (и скорее всего) гораздо больше проблем, однако вы должны иметь возможность сузить их с помощью gdb с помощью команды backtrace
(bt
) и печать в stderr
вместо stdout
, чтобы ваш вывод не буферизовался. Я не хочу делать твою домашнюю работу за тебя.