2017-03-27 39 views
-2

對於我正在處理的程序,我需要執行「字符串數學」,在給定兩個字符串的情況下,我需要對字符串中的所有字符執行加或減操作以獲得最後結果。C - 釋放分配在循環中的內存

我在解決指針問題時遇到了問題,並且在理解如何在循環中使用指針時感覺我很困難。

目前我有:

int main() { 
    char * input = (char *)malloc(sizeof(char)*1024); 
    char * stringA = (char *)malloc(sizeof(char)*64); 
    char * stringB = (char *)malloc(sizeof(char)*64); 
    char * result; 
    char operand; 
    int matched = 0; 

    while(fgets(input, 1024, stdin) != NULL) { 
     matched = sscanf(input, "%s %s %c", stringA, stringB, &operand); 
     if (matched == 3) { 
      if (strlen(stringA) < strlen(stringB)) { 
       stringA = balanceLengths(stringA, stringB); 
      } else if (strlen(stringA) > strlen(stringB)) { 
       stringB = balanceLengths(stringB, stringA); 
      } 

      result = (char *)calloc(strlen(stringA)+2, sizeof(char)); 
      result = performStringMath(result, stringA, stringB, operand); 

      printf("%s\n", result); 

     } 
    } 

    //printf("%s\n%s\n", stringA, stringB); 

    free(input); 
    free(stringA); 
    free(stringB); 
    return 0; 
} 

,我真的很努力理解我怎麼可以在循環的每一次迭代釋放的結果,因爲如果我是printf語句後添加一個免費的(結果)我從valgrind中得到幾個無效的讀寫錯誤,如果我在循環之前爲calloc分配內存,我也會出現類似的錯誤。

其他方法:

char * performStringMath(char *result, char *stringA, char *stringB, char operand) { 
    if (operand == '+') { 
     return performAddition(result, stringA, stringB); 
    } else if (operand == '-') { 
     return performSubtraction(stringA, stringB); 
    } else { 
     return 0; 
    } 
} 

char * balanceLengths(char *shorter, char *longer) { 
    int toAdd, i; 
    toAdd = (int)(strlen(longer) - strlen(shorter)); 
    char *retString = (char *) malloc(sizeof(char) * strlen(longer)+ toAdd); 

    for (i = 0; i < toAdd; i++) { 
     retString[i] = '0'; 
     retString[toAdd+i] = shorter[i]; 
    } 
    return retString; 
} 

char * performSubtraction(char *stringA, char *stringB) { 
    return ""; 
} 

char * performAddition(char *result, char *stringA, char *stringB) { 
    int carry, sum, i; 
    sum = 0; 
    carry = 0; 
    for (i = (int)strlen(stringA)-1; i >= 0; i--) { 
     sum = (stringA[i]-48) + (stringB[i]-48) + carry; 
     carry = 0; 
     if (sum >= 10) { 
      sum = sum-10; 
      carry = 1; 
     } 
     stringA[i] = (char)(sum+48); 
    } 

    if (carry != 0) { 
     result[0] = '1'; 
     result = strcat(result, stringA); 
    } else { 
     result = stringA; 
    } 

    return result; 
} 

其實我已經通過更換

result = stringA; 

到 結果=的strcpy(結果,stringA)解決了這個問題;

在功能執行添加。

+2

歡迎來到Stack Overflow! [請參閱此討論,爲什麼不在'C'中投射'malloc()'和family的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+1

將'free(result);'作爲'while'循環體的最後一個語句添加了什麼問題? –

+1

你不「釋放指針」。你釋放它指向的對象! – Olaf

回答

3

你的代碼看起來不像你很困惑。它看起來大部分正確。我看到一個缺少的呼叫free()。在您的循環中,您可以撥打calloc(),但不要在該內存上撥打free()。如果你不打算使用result你打印出來後,那麼你可以釋放它,一旦它的印刷:

 result = (char *)calloc(strlen(stringA)+2, sizeof(char)); 
     result = performStringMath(result, stringA, stringB, operand); 

     printf("%s\n", result); 
     free(result); 

其他字符串能夠被分配和釋放的循環的每次迭代中,但它會使該程序運行速度更慢,無法以任何方式幫助。

如果這給了你像valgrind這樣的工具的錯誤,那麼它可能是在performStringMath()中出現問題。但是,如果沒有這個函數的代碼,我們就無法真正說出它的可能性。

+0

感謝您的回覆,我用剩下的方法編輯了原文。當我添加你提到的免費(結果)valgrind吐出一堆無效的寫入和讀取,以及免費(結果)行上的無效自由。我覺得我在指針上正確執行自由,但我似乎無法得到這個工作。 – Raetro

+0

我已經解決了這個問題,感謝您的輸入:) – Raetro