2017-10-08 229 views
0

我建立一個函數,將在我寫的函數的工作文字刪除一個字,Çrealloc的 - 內存不分配爲我設置

但是從某些原因,存儲更多的則是我後,我分配等等完成它打印沒有字,但符號和胡言亂語的新字符串。

請幫我理解爲什麼以及如何修復它,謝謝。

時,我很快就調試內存的變化,因爲我用這個:

newStr[k] = str[i]; 



char * newText(char * word, char *str) 
{ 
int count = 0, indexS = -1,indexE = -1; 
char *newStr = (char*)calloc(1,sizeof(char)); 
int w = 0, k = 0,i,i2; 
if(strlen(word) > strlen(str)) 
    printf("Error: the word dosent exist"); 
else 
{ 
    for (i = 0; i < strlen(str); i++) 
    { 
     if (str[i] != word[w]) 
     { 
      newStr[k] = str[i]; 
      k++; 
      newStr = realloc(newStr, k + 1); 
     } 
     else 
     { 
      i2 = i; 
      while (str[i2] != ' ' && str[i2] != '\0') 
      { 
       if (str[i2] == word[w]) 
       { 
        count++; 
        w++; 
        i2++; 
       } 
       else 
       { 
        count = -1; 
        break; 
       } 

      } 
      if (strlen(word) == count) 
      { 
       i = i2; 
       if (str != '\0') i++; // space 
      } 
      else 
      { 
       newStr[k] = str[i]; 
       k++; 
       newStr = realloc(newStr, k + 1); 
      } 
      count = 0; 
      w = 0; 
     } 
    } 
} 
str[k] = '\0'; 
return newStr; 
} 
+1

請提供[mcve]。 – BLUEPIXY

+3

你忘了null-terminate newStr。 –

+1

當調用任何堆分配函數時:(malloc,calloc,realloc)1)總是檢查(!= NULL)以確保操作成功。 2)返回的類型是'void *',因此可以分配給任何指針。在調用'realloc()'時,不要將返回的指針指向目標變量,直到檢查(!= NULL)後才能確保操作是成功的。否則,原始指針會丟失,導致內存泄漏 – user3629249

回答

3

你在最後追加'\0'字符錯誤的字符串,然後返回:

str[k] = '\0'; 

使其:

newStr[k] = '\0';