2013-02-18 4 views
-2

에 결함으로 하여금. 어떤 제안?FCLOSE는 SEG 나는 경우에만 나는 파일을 닫으려고하면 독방 감금 오류가 계속 C

gdb의 오류가 여기로 리디렉션됩니다. 모든 변수가 선언 된 함수라고 가정합니다. 또한 gdb는 내가 사용하지도 않는 strtol을 비난합니다. 파일을 닫을 때 나는 항상 그것을 할

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

와 나는 또한 포인터를 넣어 :

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가 null이 아닌 확인 동일한 파일을 두 번 닫으 려하지 않으려면 NULL로 설정하십시오 (문제가 발생할 수 있음).

하지만 가장 일반적인 원인은 일부 메모리 누수 또는 정의되지 않은 동작으로 인해 상황이 엉망이고 segfault가 fclose()에 의해 방금 트리거됩니다.

+0

그러면 fclose()가 왜 그것을 트리거할까요? 오류 코드는 atoi의 오류를 가리키고 있지만 배열은 모두 올바르게 채 웁니다. 이해가 안됩니다. – SystemFun

+0

'fclose()'에서 표준 라이브러리는 리소스를 OS로 릴리즈합니다. 그 시점에서 무언가가 엉망이되면 읽기 전용 메모리에 쓰거나 다른 예외를 유발할 수 있습니다. (0으로 나누는 것은 거의 불가능하지만 여전히 가능합니다.) 상상할 수 있습니다. –

+0

그래서 대부분의 경우, 어딘가에 있어야 할 곳이 아닌데,이 파일을 닫을 때까지 프로그램이이를 인식하지 못합니다. – SystemFun

1

내 생각에 fclose()에 도달하면 outFilePtr 값이 보존되지 않습니다.

코드 스 니펫이 너무 짧아서 중요한 요소 일 수있는 너무 많은 다른 것들을 놓치게됩니다 ... 문자열과 num2는 무엇입니까? 그들이 얼마나 큰 지 할당 받았다. ...

또한 * (num2 + t)에 대한 첫 번째 저장소는 두 번째 * (num2 + t)로 덮어 씁니다.

도 참조하십시오. ... num2 [t]는 * (num2 + t)보다 읽기가 쉽고 동일한 작업을 수행합니다.

+0

코드를 전송할 때 오류 인 덮어 쓰기 부분을 적용 할 수 없습니다. 나는 전체 프로그램을 아주 길게 줄 수는 없다. 어떻게 보존되지 않을까? 왜 여기로 향하게 될까요? – SystemFun

+0

보존하지 않는 가장 쉬운 방법은 덮어 썼기 때문입니다. 따라서 모든 할당에 대한 내 쿼리가 필요합니다. fopen 후 fclose 전에 - printf ("% X \ n", (unsigned) outFilePtr);'를 추가하십시오. 값이 동일한 지 확인하십시오. 또 다른 생각 - 당신은 한 번 이상 fclose'ing 아니에요? – Anonymouse

1

끔찍한 배열 액세스 구문을 제외하고. 입력 문자열 줄을 복사하는 것을 잊었습니다. strtok은 항상 모든 행에서 변경되는 동일한 버퍼를 가리 킵니다. 당신이 정말로 5 바이트를 할당하는 경우는 대신 50 만 5 바이트를 할당하면 할당 코드에서

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, " ")); 
     } 

는, 당신은 힙을 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

하지만 내 대답은 말했다. 문제는 힙이 어딘가에 덮어 쓰거나 두 번 풀리는 것처럼 보입니다. –