2015-12-21 104 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