Пожалуйста, попробуйте GDB отследить, где происходит ошибка сегмента. Предполагая, что вы работаете в Linux / Unix, скомпилируйте код с параметрами (если компилятор gcc)
gcc -ggdb -g3 <.c file> -o <progname>
Выполнить progname с GDB как
gdb <progname>
По приглашению GDB
gdb> run
В приглашении segfault GDB будет показано, где вы проверяете возврат, как
gdb> bt
Он покажет номер строки, в которой произошла ошибка, вместе со стеком вызовов функций (кадры с номером)
Для проверки значений переменных или указателей используйте команду печати gdb
gdb> p <varnams>
Чтобы проверить конкретную функцию в стеке вызовов, перейдите к этому кадру стека как
gdb> frame <frame number>