2011-01-12 3 views
0

Выполняю несколько вызовов функции, которая считывает данные из входного файла. Все отлично работает в режиме отладки, но когда я пытаюсь запустить исполняемый файл из режима деблокирования, линия с fopen сбрасывает программу после нескольких вызовов. Мой код: Из заголовка файла:сбой 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, но он падает до того, как он даже попадает на чек. Единственное, о чем я могу думать, это то, что у меня возникают проблемы с памятью, но я не знаю, как это может сгореть. Кто-нибудь знает, что может произойти? Благодаря!

EDIT 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().

+0

У вас, вероятно, есть еще одна проблема в вашем коде, и проблема, которую вы видите, является лишь побочным эффектом этого. Попробуйте запустить под valgrind. –

+0

@Paul R: К сожалению, нет такой вещи, как valgrind в Windows. VC имеет средство отладки на основе источника, хотя ... – thkala

ответ

0

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

EDIT:

Другой распространенной причиной этого является имя файла строка, которая вдруг перестает быть нулем.

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

EDIT 2:

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

+0

Вызов printf() создает правильную строку (я использовал% sxxx, используя xxx, чтобы убедиться, что нет пробелов в пробелах). Есть ли у вас какие-либо предложения о том, какая коррупция в памяти может быть? Я изучаю отладчик, но я не знаю, как его использовать прямо сейчас. Я всегда отлаживал свои программы, вставляя комментарии. – Jade

+0

Вызов этой функции с FILE * fidwrite находится внутри цикла. Перед этим циклом я открываю другой файл для записи, поскольку цикл работает (FILE * fidwritediag). Может ли одновременно открываться два файла, один из которых внутри цикла (на самом деле это гнездо из трех циклов), имеет какое-либо отношение к нему? – Jade

+0

@Jade: Смотрите мое редактирование. Попробуйте добавить большой объем дополнительной памяти ко всем вашим вызовам malloc. Если это устраняет проблему, вы начинаете отслеживать проблему. – thkala

Смежные вопросы