В функции player_movement_calc()
у вас есть collision(&char_rects[0], &char_rects[2])
. Похоже, вы должны сравнивать прямоугольники игроков с
bool collided = collision(&char_rects[0], &char_rects[1]);
Возможно, вы читаете за пределами массива char_rects
, что вызывает неопределенное поведение. Любые побочные эффекты, вызванные printf
, такие как выделение памяти для собственных целей или буфер stdout
, могут изменить поведение программы, например, сделав доступ к памяти за пределами читаемого конца массива, следовательно, удалив сбой и сокрытие ошибки.
Другим потенциальным объяснением является то, что вызов collision
может быть пропущен компилятором, если его результат не используется и если функция collision
не имеет побочных эффектов. Без static
и printf
функция не имеет побочного эффекта (кроме сбоя, вызванного чтением за пределами массива, что в любом случае является неопределенным поведением). Изменение значения static
может быть сочтено бесполезным компилятором, так как эта переменная нигде не используется и не определена volatile
. printf
имеет побочные эффекты, поэтому при его вызове collision
не очищается, поэтому вызов не может быть отменен.
Всегда трудно понять смысл неопределенного поведения. При отладке вы должны сначала отключить все оптимизации. Ошибка, вероятно, видна без printf
с отключенными оптимизациями, отслеживание кода и отслеживание локальных переменных должно быть намного проще с неоптимизированным кодом.
Если в отладочной сборке есть воспроизводимая ошибка сбоев, просто используйте отладчик, чтобы показать вам, где это происходит. Крушение ошибок должно быть легко расследовать.