Сбой fopen только при запуске из исполняемого файла релиза - PullRequest
0 голосов
/ 12 января 2011

Я делаю несколько вызовов функции, которая читает данные из входного файла. Все отлично работает в режиме отладки, но когда я пытаюсь запустить исполняемый файл из режима выпуска, строка с fopen вылетает из программы после нескольких вызовов. Мой код: Из заголовочного файла:

#define presstankdatabase "presst_database.txt"

В функции:

FILE *fidread;

fidread = fopen(presstankdatabase,"r");
if (fidread==NULL) {
    printf("Failed to open pressurant tank database: %s\n",presstankdatabase);
    return 1;
}

При отладке я вставлял строки комментариев непосредственно перед и сразу после строки, начинающейся с fidread =, и после нескольких вызовов программа вылетает, и я получаю сообщение «В результате проблемы программа перестала работать правильно. Пожалуйста, закройте программа «. Комментарий непосредственно перед вызовом fopen отображается, а комментарий после - нет. Насколько я понимаю, fopen должен возвращать либо указатель, либо NULL, но он вылетает до того, как доходит до проверки. Единственное, о чем я могу думать, это то, что у меня почему-то возникают проблемы с памятью, но я не знаю, как это сработало бы при сбое fopen. Кто-нибудь знает, что может происходить? Спасибо!

РЕДАКТИРОВАТЬ 1: я увеличил размер трех переменных, и единственные места, где они используются (кроме вызовов printf ()), показаны ниже.

char *constid = (char*)malloc(sizeof(char)*20);

Используется так:

strcpy(constid,"Propellant");
strcpy(constid,"Propellant tank");
strcpy(constid,"Pressurant tank");

Если переменные имеют размер 20, как показано выше, происходит сбой. Но если они больше (я пробовал 120 и 100), программа запускается. Переменные не используются ни в каких других местах, кроме вызовов fprintf () или printf ().

1 Ответ

0 голосов
/ 12 января 2011

presstankdatabase должен быть указателем на строку, содержащую открываемое имя файла.Если fopen() падает, то этот указатель, вероятно, недействителен (или НЕДЕЙСТВИТЕЛЕН).Без кода больше невозможно отладить его дальше.Используйте отладчик VC, чтобы увидеть, что происходит ...

РЕДАКТИРОВАТЬ:

Еще одна распространенная причина этого - строка имени файла, которая внезапно перестает заканчиваться символом NULL.

Вы должныдобавьте вызов printf(), чтобы напечатать имя файла перед открытием.Скорее всего, он не даст ожидаемый результат.Если нет, то у вас есть более интересная форма повреждения памяти, которая потребует дополнительной работы, чтобы отсеять ее.

EDIT 2:

Если вызов printf() показывает правильную строку, тоВозможно, у вас в коде повреждена память где-то еще, что исказило внутреннюю структуру библиотеки C.Распространенной причиной является выход за пределы (или, если на то пошло, начало) статического массива или области, предоставленной malloc().

...