2015-04-23 53 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

沒關係,我明白你現在說的話。 –