2015-12-21 3 views
0

Я хочу загрузить char из файла в 2D-массив. Но я не знаю длины отдельных строк (1 строка (1 слово) на 1 строку в массиве). Поэтому я выделил массив 1 * char *, а затем подсчитал символы в 1 строке и выделил их. Затем мне захотелось создать массив realloc (2 * char *), чтобы он мог обрабатывать 2 строки. Здесь, во второй очереди, он всегда сбой (строка patterns=realloc(patterns, sizeof(*patterns)*patternCounter);). Я знаю, что код не идеален (я не контролирую ошибки и т. Д.), Но я не думаю, что это поможет. Теперь это тоже не работает.C realloc 2D char array

Примечание: первый аргумент функции еще не

входного файла (1 слово в каждой строке, конец строки «\ п», так что последняя строка пуста)

woman 
man 
meat 
animal 
anim 

Мой код используется

void failure(state *automaton, FILE *fpattern){ 

    int patternCounter=0, charCounter=0, i; 
    char c; 
    char **patterns=NULL; 

    rewind(fpattern); 

    while((c=fgetc(fpattern))!=EOF){ 
     charCounter++; 

     if(c=='\n') { 
      patternCounter++; 
      patterns=realloc(patterns, sizeof(*patterns)*patternCounter); 

      fseek(fpattern, -charCounter, SEEK_CUR); 

      for (i = 0; i < charCounter; i++) { 
       patterns[i]=malloc(1); 
      } 

      for (i = 0; i < charCounter-1; i++) { 
       patterns[patternCounter-1][i]=(char)fgetc(fpattern); 
      } 

      patterns[patternCounter-1][i]='\0'; 

      fgetc(fpattern); 

      charCounter=0; 

      printf("%s\n", patterns[patternCounter-1]); 
     } 
    } 

    for (i = 0; i < patternCounter; i++) { 
     printf("%s\n", patterns[i]); 
    } 
} 

Я не понимаю, что не так. Отладка не помогла.

+0

линии 'шаблонов [patternCounter-1] [I] = (символ) fgetc (fpattern);' должен вызвать переполнение буфера, так как только один байт выделяется 'patterns [patternCounter-1]'. Кроме того, выброс ранее прочитанных данных - очень плохая идея. – MikeCAT

+0

Fmmm, на самом деле 'patterns [patternCounter-1]' может быть неинициализирован. – MikeCAT

+0

Есть ли у вас максимальная длина слов? Это упростит вам задачу, потому что выделение байта по байтам не так велико ... – Holt

ответ

0

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

Попробуйте изменить

for (i = 0; i < charCounter; i++) { 
    patterns[i]=malloc(1); 
} 

к

patterns[patternCounter-1]=malloc(charCounter); 
+0

Да. Ты прав. Спасибо. Такая плохая ошибка, не знаю, почему я этого не понял. – kubrdom