2015-12-21 57 views
0

我想從文件加載字符到二維數組。但我不知道單獨行的長度(陣列中每行1行(1行))。所以我分配了1 * char *數組,然後計算1行中的字符並分配它們。然後我想realloc(2 * char *)數組,因此它可以處理2行。在第二回閤中,它總是崩潰(行patterns=realloc(patterns, sizeof(*patterns)*patternCounter);)。我知道代碼不完美(我不控制錯誤等),但我認爲這不會有幫助。現在它也不起作用。C realloc二維字符數組

注:的函數的第一個參數尚未

輸入文件(每行1個字,端線「\ n」,所以最後一行是空的)

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] =(char)的龜etc(fpattern);'應引起,因爲只有1個字節的緩衝區溢出被分配給'patterns [patternCounter-1]'。另外,拋出以前讀取的數據是非常糟糕的主意。 – MikeCAT

+0

Fmmm,實際上'patterns [patternCounter-1]'可能是未初始化的。 – MikeCAT

+0

你的單詞有最大長度嗎?它會讓你更容易,因爲按字節分配數組並不是那麼好... – Holt

回答

0

您正在丟棄以前分配的緩衝區並僅分配1個元素,然後嘗試在那裏保存太多字符,這是非常糟糕的事情。

嘗試改變

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

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

是的。你是對的。非常感謝。這樣糟糕的錯誤,不知道爲什麼我沒弄明白。 – kubrdom