2016-12-07 5 views
-1

Я не могу понять, почему эта программа является сегментом разломообразования когда-либо я запустить эту функцию: https://github.com/biohazard-hack/high-hand/blob/master/events.c#L73Сегмент Fault На любом файл доступ C/SDL2

У меня есть другая версия этой программы, которая была черновиком и is here: http://pastebin.com/TgiqM9tX

Я понимаю, что как я читаю файл в текущей версии, это неправильно, но он сегментирует ошибки, когда я использую fscanf() или что-либо для доступа к файлу.

Он откроет файл в текстовом или двоичном формате для чтения просто отлично, а второй я делаю любой вид чтения, он взрывается.

(GDB) запустить Запуск программы:/Главная/трейсер/код/​​ГРС/высокая рука/высокая рука [доводка резьбы с использованием libthread_db включен] Использование хоста libthread_db библиотеки «/ Библиотека/x86_64-Linux-гну /libthread_db.so.1" . INFO: Рука не NULL

Это выход с помощью fscanf() из GDB:

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff7537686 in _IO_vfscanf_internal ([email protected]=0x9ee820, 
    format=<optimized out>, [email protected]=0x7fffffffdc78, 
    [email protected]=0x0) at vfscanf.c:843 
843 vfscanf.c: No such file or directory. 

ответ

0

В следующий раз, пожалуйста, по крайней мере, запустить отладчик; вы не пойдете далеко, не решив свои ошибки сами.

Проблема не связана с кодом. В main.hextern char* Curl[5]; есть, но в main.c он инициализирован с:

char*   Curl[5] ={ "img/cards/rj.png", 
          "img/cards/rj.png", 
          "img/cards/rj.png", 
          "img/cards/rj.png", 
          "img/cards/rj.png" 
}; 

строковые константы помещаются в постоянной памяти и не могут быть изменены. Когда вы пытаетесь изменить эти строки, вы получаете segfault, потому что пытаетесь писать на страницы только для чтения.

Возможно, простейшее решение меняет тип, например. char Curl[5][32] (убедитесь, что размер достаточен для хранения имени файла) в обоих местах.

В качестве побочного примечания ваше тяжелое злоупотребление глобальными переменными требует возникновения проблем, а foo() - это не то, как функция, которая не принимает аргументов, определена в C (но она находится в C++, хотя).

+0

Спасибо, я знаю, что глобальные переменные являются проблемой здесь, просто чувствуя, где их разместить, и где я в конечном итоге их использую. в противном случае я в конечном итоге передаю многие ценности бесконечным местам. – Joe