Добро пожаловать в Stack Overflow, и добро пожаловать в программирование!
Согласно связанным комментариям, segfault, скорее всего, вызван выходом за границы вашего maze[][]
массива. В нескольких комментариях вы спрашиваете, как вы можете справиться с этой ситуацией.
В интересах предоставления наиболее конструктивного совета, вместо того, чтобы давать вам код, я собираюсь спросить вопрос:
Как в программировании мы заставляем что-то происходить или не происходить при определенных c условиях?
Итак, опишите для себя условия в который вы должны не делать ссылки, такие как i + 1
или j - 1
, а затем добавлять соответствующие logi c в свой код.
Я также призываю вас спросить себя:
Сколько раз моя функция move()
изменяет maze[][]
для одного входа?
Запишите свой ответ, а затем добавьте операторы вывода или, например, функция show()
, которая выводит общее текущее состояние maze[][]
в самой внутренней части ваших циклов в move()
. Посмотрите, соответствует ли ожидаемый ответ вашему фактическому результату.
Что касается вашего описания этой программы, когда вы:
"нажимаете кнопку s или d, это вызывает ошибку сегментации. но с кнопкой и кнопкой w он работает нормально "
... Я бы сказал, что только появляется , чтобы работать, когда вы нажимаете кнопку a
или w
кнопка. Фактически, всякий раз, когда вы ссылаетесь за пределы массива (что может произойти независимо от того, какой из w
, a
, s
или d
нажат), поведение будет undefined . Так что, случайно, способ компиляции программы (для вас, в определенное время) может не сразу привести к сбою при нажатии w
. Когда вы обращаетесь за пределами массива, вы можете получить доступ к памяти, к которой можно получить доступ, и она будет казаться работающей; но вы можете получить доступ к памяти, которая недоступна для вашего процесса, и это будет segfault.
Ошибки, связанные с неопределенным поведением , могут быть наиболее тонкими. Logi c служит в качестве ограждения, а операторы вывода отладки для отображения фактических изменений значений могут немного помочь.