2014-11-02 2 views
0

나는이 문제를 디버깅하여 내 fgets가 작동하지 않는 이유를 알 수 없습니다. 코드를 동적으로 배열 크기를 변경하기 전에 fgets가 완벽하게 작동합니다. 내가 C에서 초보자 인 이래로이 문제는 오랫동안 나를 당황하게했다. fgets의 분할 오류

int readNumbers(int array[], char* fname, int hexFlag) { 
    int numberRead = 0; 
    FILE* fp; 
    int counter = 0; 
    char arr[100]; 
    char* ptr; 

    fp = fopen(fname, "r"); 

    if (fp == NULL) { 
      printf("Error opening file\n"); 
      return -1; 
    } 

    while (fgets(arr, sizeof(arr), fp)) { 
      ptr = strtok(arr, " \n"); 
      while(ptr) { 
       if (hexFlag == 0) { 
        array[counter++] = strtol(ptr , NULL , 10); 
       } else { 
        array[counter++] = strtol(ptr, NULL, 16); 
       } 
       ++numberRead; 
       ptr = strtok(NULL , " \n"); 
      } 

    } 
    if (ferror(fp)) { 
      fclose(fp); 
      return -1; 
    } 

새로 추가 된 변경 SEG 결함

이 파일의 끝은 다음과 같습니다

여기
int readNumbers(int **array, char* fname, int hexFlag) { 
    int numberRead = 0; 
    FILE* fp; 
    int counter = 0; 
    char arr[100]; 
    char* ptr; 
    size_t curSize = 16; 
    int radix = hexFlag ? 16 : 10; 

    *array = malloc(0 * sizeof(*array)); 

    fp = fopen(fname, "r"); 

    if (fp == NULL) { 
      printf("Error opening file\n"); 
      return -1; 
    } 

    while (fgets(arr, sizeof(arr), fp)) { //Seg faults here when it reaches end of file. 
      ptr = strtok(arr, " \n"); 
      while(ptr) { 
       if (counter >= curSize) { 
        curSize += 16; 
        array = realloc(*array, curSize * sizeof(**array)); 
       } 
       (*array)[counter++] = strtol(ptr, NULL, radix); 
       ++numberRead; 
       ptr = strtok(NULL , " \n"); 
      } 

    } 
    if (ferror(fp)) { 
      fclose(fp); 
      return -1; 
    } 

는 변화가 배열 크기 조정을 할 전에 작업 코드 : 여기

는 결함이있는 코드입니다 도달했습니다. 나는 이것이 이중 포인터와 관련이 있다고 강력하게 생각한다. 어떤 도움을 강력하게 감사드립니다!

+2

그것이 효과가 있다고 생각 했습니까? '* array = malloc (0 * sizeof (* array)); ' –

+0

@AmitSharma 아! 나는 그것이 고정되어있는 것을 본다! 하지만 그게 fgets가 파일 대신에 즉시 오류를 일으키는 원인이 될지 이해하지 못합니다. – Ansdai

답변

1

전체 코드를 검토하지 않았습니다. 그러나 *array = malloc(0 * sizeof(*array)) 여기이 malloc 호출은 메모리를 할당하지 않습니다.

당신은 처음 사용하여 동적 배열을 할당 : 문제 아 미트 샤르마 이외에

1

지적

*array = malloc(0 * sizeof(*array)); 

을 그리고 당신은 동적 배열에 저장할 때 사용

(*array)[counter++] = strtol(ptr, NULL, radix); 

그러나 이후의 재 할당에는 다음이 사용됩니다.

array = realloc(*array, curSize * sizeof(**array)); 
가능성이

을해야한다 :

*array = realloc(*array, curSize * sizeof(*array)); 

참고 코드가 NULL 포인터 리턴 또는 수 할당을 처리 할 준비가되어 같이만큼, malloc(0)를 사용하는 OK (통상적이지 않지만 전례가없는)하다는 읽거나 쓸 수 없습니다.