2015-04-23 111 views
-1

我试图复制一个char word[50]数组到char **wordlist双指针,然后realloc(wordlist, (numwords+1)*sizeof(char*))将单词表的大小再增加一个char*以保存下一个wordC:双指针的Realloc问题

我不断收到一个错误*** glibc detected *** ./program: realloc(): invalid next size

我声明它作为wordlist = realloc(wordlist, (numwords+1)*sizeof(char*))

void outFile(char *argv[], char **wordlist) 
    { 
     if((inFilePtr = fopen(argv[2], "r")) != NULL) 
     { 
      if((outFilePtr = fopen(endOfFile, "w")) != NULL) 
      { 
       while((c = fgetc(inFilePtr)) != EOF) 
       { 
        if(!(isspace(c))) 
        { 
         word[wordIndex] = c; 
         wordIndex++; 
         rowLim++; 
        } 
        if(isspace(c)) 
        { 
         wordIndex = 0; 
         if(rowLim < limit) 
         { 
          rowLim++; 
          strcat(text[rowNum], word); 
          strcat(text[rowNum], " \0"); 
          wordlist[numwords] = strdup(word); 
          /*strcat(wordlist[numwords], "\n\0");*/ 
          memset(word, 0, 50); 
          prev = rowLim; 
          wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*)); 
          numwords++; 
         } 
         else 
         { 
          strcat(text[rowNum], "\n\0"); 
          printf("text[%d] = %s",rowNum, text[rowNum]); 
          fputs(text[rowNum], outFilePtr); 
          rowNum++; 
          strcat(text[rowNum], word); 
          strcat(text[rowNum], " \0"); 
          /*strcat(wordlist[numwords], word); 
          strcat(wordlist[numwords], "\n\0"); 
          wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*));*/ 
         numwords++; 
         memset(word, 0, 50); 
         rowLim = rowLim - prev; 
        } 
        wordIndex = 0; 
       } 
      } 
      strcat(text[rowNum], "\n\0"); 
      printf("text[%d] = %s",rowNum, text[rowNum]); 
      fputs(text[rowNum], outFilePtr); 
      fclose(outFilePtr); 
     } 
+0

这是怎么回事?你能提供更多细节吗? –

+0

但numwords被初始化为0,那么总是不会分配空间? –

+0

@PythonNoob发布一个MCVE。你在程序的其他地方犯了一个错误,但不可能说出来,因为你没有显示其他程序。 –

回答

1

您正在尝试使用的空间已经分配您之前:

wordlist[numwords] = strdup(word); 
wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*)); 
numwords++; 

相反,先分配空间:

wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*)); 
wordlist[numwords] = strdup(word); 
numwords++; 

注意:正如iharob所指出的,如果您希望能够从内存不足中恢复过来,那么realloc的返回值应该存储在一个单独的变量中,直到您确认它不是NULL

您所有的\0都是多余的。字符串文字是字符串:例如"\n"意味着已经有{ '\n', '\0' }

从这段代码是不可能告诉你是否因text[rowNum]太多而导致缓冲区溢出。我建议重新设计这个代码,以确保它永远不会溢出。

+0

在我的主要方法中,我有: char ** wordlist = malloc(sizeof(shar *));' –

+0

没关系,我明白你现在说的话。 –