Я собираюсь показать вам процесс отладки, который вы должны изучить, чтобы вы могли решить эти проблемы самостоятельно.Шаги, которые я предпринял, показаны ниже.Имейте в виду, что я не пытаюсь исправить все возможные проблемы с вашим кодом.Я только что изолировал и исправил первоначальную проблему.
Вы должны ознакомиться с такими инструментами отладки, как gdb
и valigrind
.Иногда запуск исполняемого файла под отладчиком приводит к исчезновению проблемы.В этих случаях очень полезен инструмент проверки доступа к памяти, такой как valgrind
.
Я запустил ваш код с valgrind
, и он дал мне следующий вывод:
Перед запуском valgrind
Вы должны построить свой исполняемый файл с отладочными символами.Предполагая, что gcc вы можете выполнить следующие шаги:
jnorton@ubuntu:~/source$ gcc -ggdb fault.c
jnorton@ubuntu:~/source$ ./a.out
pch = this
Segmentation fault (core dumped)
jnorton@ubuntu:~/source$ clear
jnorton@ubuntu:~/source$ gcc -ggdb fault.c
jnorton@ubuntu:~/source$ valgrind --leak-check=yes ./a.out
==6745== Memcheck, a memory error detector
==6745== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==6745== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==6745== Command: ./a.out
==6745==
pch = this
==6745== Invalid read of size 2
==6745== at 0x108B25: main (fault.c:35)
==6745== Address 0x2fda2c0 is not stack'd, malloc'd or (recently) free'd
==6745==
==6745==
==6745== Process terminating with default action of signal 11 (SIGSEGV)
==6745== Access not within mapped region at address 0x2FDA2C0
==6745== at 0x108B25: main (fault.c:35)
==6745== If you believe this happened as a result of a stack
==6745== overflow in your program's main thread (unlikely but
==6745== possible), you can try to increase the size of the
==6745== main thread stack using the --main-stacksize= flag.
==6745== The main thread stack size used in this run was 8388608.
==6745==
==6745== HEAP SUMMARY:
==6745== in use at exit: 552 bytes in 1 blocks
==6745== total heap usage: 3 allocs, 2 frees, 5,672 bytes allocated
==6745==
==6745== LEAK SUMMARY:
==6745== definitely lost: 0 bytes in 0 blocks
==6745== indirectly lost: 0 bytes in 0 blocks
==6745== possibly lost: 0 bytes in 0 blocks
==6745== still reachable: 552 bytes in 1 blocks
==6745== suppressed: 0 bytes in 0 blocks
==6745== Reachable blocks (those to which a pointer was found) are not shown.
==6745== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==6745==
==6745== For counts of detected and suppressed errors, rerun with: -v
==6745== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Segmentation fault (core dumped)
jnorton@ubuntu:~/source$
Уведомление valgrind
сообщил:
==6745== at 0x108B25: main (fault.c:35)
Я добавил несколько отладочных printfs, но строка 35:
if(isalpha(pch)){
Здесь происходит segfault
, потому что isalpha()
принимает аргумент int
, а не указатель на строку.Изменение этой строки на следующее останавливает segfault
:
if(isalpha((int)pch[0])){
Теперь, это только одна проблема в вашем коде.У вас может есть другие проблемы.