2013-02-18 3 views
-2

я получаю ошибку сегм, если и только если я пытаюсь закрыть файл:Fclose вызывающее сегментный вина в C

FILE *outFilePtr = fopen(*(argv + 2), "w"); //open file, yes i'm sure it opens 


    fclose(outFilePtr); //sometime later in the program. 

Программа проходит от начала до конца без flcose(). Какие-либо предложения?

Ошибка при перенаправлении gdb здесь: Предположим, что это функция со всеми объявленными переменными. Также gdb обвиняет strtol, которого я даже не использую.

int t; 
    char line[50]; 

      for (t = 0; t < lines; t++){ 
       fgets(line, 50, filePtr); 
      strcpy(*string[t], strtok(line, " ")); 
       *(num1 + t) = atoi(strtok(NULL, " ")); 
       *(num2 + t) = atoi(strtok(NULL, " ")); 
      } 

Распределение памяти Функция

void dynamicArray(int** num1, int** num2, char*** str, int size) 
{ 
    int i = 0; 

*(num1) = (int*)malloc(sizeof(int) * size); 
*(num2) = (int*)malloc(sizeof(int) * size); 

*(str) = (char**)malloc(sizeof(char*) * size); 

for(i = 0; i < size; i++){ 
    *(*(str) + i) = (char*)malloc(sizeof(char) *size); 
} 

return; 
} 
+6

Вы оставили интересную часть того, что происходит между ними. Из того, что вы показали, нет, он не должен терпеть крах. – FatalError

+0

Как мы можем предложить что-то из этого образца? – UmNyobe

+0

В этом нет проблем. Убедитесь, что только файл открыт? а как насчет других действий? – 999k

ответ

1

Просто, чтобы быть уверенным, убедитесь, что outFilePtr не равно нулю:

if (outFilePtr) {fclose(outFilePtr); outFilePtr = NULL;} 

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

Но, скорее всего, причиной является некоторая утечка памяти или неопределенное поведение, которое мешает всему, а segfault запускается только fclose().

+0

Так почему бы fclose() вызвать его. Код ошибки указывает на ошибку с atoi, но массивы все правильно заполняются. Я не понимаю. – SystemFun

+0

на 'fclose()' стандартная библиотека освобождает ресурсы для ОС. Я могу себе представить, что если что-то испортится в этот момент, вы можете закончить запись в памяти только для чтения или вызвать другое исключение (div на ноль кажется мне маловероятным, но все же возможно). –

+0

Так что, скорее всего, у меня есть какая-то память где-то, где это не так, и программа не понимает этого, пока я не попытаюсь закрыть этот файл? – SystemFun

1

Я предполагаю, что значение outFilePtr не сохраняется, когда вы получаете fclose().

Ваш фрагмент кода слишком короткий и пропускает слишком много других вещей, которые могут быть важны ... Что такое строки и num2; насколько они распределены; и т. д.

также первый магазин до * (num2 + t) заменяется вторым * (num2 + t).

также также смотрите ARRAYS .... num2 [t] гораздо легче читать, чем * (num2 + t) и выполняет ту же работу.

+0

Переписывающая часть является неприменимой, что является ошибкой при передаче кода. Я не могу дать всю программу достаточно долго. Как бы это не сохранилось? И зачем это здесь? – SystemFun

+0

Самый простой способ не быть сохраненным - это потому, что он был перезаписан - следовательно, мой запрос обо всех распределениях. Попробуйте добавить 'printf ("% X \ n ", (unsigned) outFilePtr);' после fopen и перед fclose - убедитесь, что значение равно. Другая мысль - вы не много раз работаете, не так ли? – Anonymouse

1

За исключением вашего синтаксиса доступа к ужасному массиву. Вы забыли дублировать строку ввода. strtok всегда указывает на тот же буфер, который изменяется на каждой строке.

int t; 
char line[50]; 

     for (t = 0; t < lines; t++){ 
      fgets(line, 50, filePtr); 
      strings[t] = strdup(strtok(line, " "))); 
      num1[t] = atoi(strtok(NULL, " ")); 
      num2[t] = atoi(strtok(NULL, " ")); 
     } 

В вас коде выделения вы также выделить только 5 байт вместо 50. Если вы действительно выделяется только 5 байт, то вы clobbert кучу, и это проявляется часто сбой fclose.

void dynamicArray(int** num1, int** num2, char*** str, int size) 
{ 
int i = 0; 

*num1 = malloc(sizeof(int) * size); 
*num2 = malloc(sizeof(int) * size); 

*str = malloc(sizeof(char*) * size); 

for(i = 0; i < size; i++) 
    (*str)[i] = malloc(50);  /* sizeof (char) is by definition 1 */ 

return; 
} 
+0

Я понятия не имею, как сюда попали пять. Ни одна из этих ошибок не содержится в моем коде, я прошу прощения. У меня есть strcpy() в моем реальном коде. – SystemFun

+0

Хорошо. Это либо выделение фиксированного размера, либо 'strcpy', либо' strdup', но не определенный цикл выделения в dynamicArray(). –

+0

Но, как сказано, в моем ответе. Ваша проблема выглядит как перезапись где-то, или двойное освобождение. –