2014-11-02 2 views
0

Я отлаживал это из-за этого и не могу понять, почему мои фэги не работают. Прежде чем я изменил свой код таким образом, чтобы он динамически менял размеры массивов, fgets работает отлично. Поскольку я новичок в C, эта проблема сбила меня с толку довольно долго.Ошибка сегментации от fgets

Вот дефектный код:

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; 
    } 

Вот рабочий код, прежде чем изменения, чтобы сделать изменение размера массива:

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 неисправности, когда конец файла достиг. Я сильно подозреваю, что это связано с двойными указателями. Любая помощь очень ценится!

+2

подумал ли он будет работать ..? '* array = malloc (0 * sizeof (* array));' –

+0

@AmitSharma Ah! Я вижу, это исправлено! Но я не понимаю, как это может привести к тому, что 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)); 

Обратите внимание, что это нормально (необычно, но не неслыханное) использовать malloc(0), до тех пор, как ваш код готов иметь дело с NULL возвращения указателя или выделения, которые могут читать или писать.

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