2010-11-15 61 views
0

我試着按以下規則來分割字符串:內存泄漏問題,而用C分割字符串

  1. 話不「」,圍繞他們應該單獨字符串
  2. 什麼室內用對待「」周圍它應該被視爲一個字符串

但是,當我在valgrind中運行它我得到無效的釋放和無效的讀取大小錯誤,但如果我刪除兩個釋放我得到一個內存泄漏。如果任何人都可以在正確的方向指向我,我將不勝感激

調用split_string

char *param[5]; 
    for(i = 0;i < 5;i++) { 
      param[i] = NULL; 
    } 
    char* user = getenv("LOGNAME"); 
    char tid[9]; 
    char* instring = (char*) malloc(201); 

    /
    while((printf("%s %s >",user,gettime(tid)))&&(instring 
      =fgets(instring,201,stdin)) != NULL) { 
      int paramsize = split_string(param, instring); 

試圖釋放PARAM

   for(i = 0;i < 5;i++) { 
       if(param[i] != NULL) { 
        free(param[i]); 
        fprintf(stderr,"%d",i); 
       } 
      } 

int split_string(char** param, char* string) { 
    int paramplace = 0; //hvor vi er i param 
    int tempplace = 0; //hvor i temp vi er 

    char* temp = malloc(201); 
    int command = 0; 
    int message = 0; 
    for(; (*string != '\0') && (*string != 10) && paramplace < 4; string++) { 
      if((*string == ' ') && (message == 0)) { 
        if(command == 1) { 
         temp[tempplace] = '\0'; 
         param[paramplace++] = temp; 
         tempplace = 0; 
         command = 0; 
        } 
      } 
      else { 
        if(*string =='"') { 
          if(message == 0) message = 1; 
          else message = 0; 
        } 
        if(command == 0) { 
          free(temp); 
          temp = malloc(201); 
        } 
        command = 1; 
        if(*string != '"') { 
          temp[tempplace++] = *string; 
        } 
      } 
    } 
    if(command == 1) { 
      temp[tempplace] = '\0'; 
      param[paramplace++] = temp; 
    } 
    param[paramplace] = NULL; 
    free(temp); 
    return paramplace; 
} 
代碼代碼

回答

2

據我所見,你想把分割字符串作爲一個指針數組(可能使得調用者負責釋放它們)成爲param。在循環中if語句的第一個分支中,通過將當前的temp緩衝區分配給該地點來執行此操作。然而,一旦你開始一個新的字符串(當comnmand == 0,你釋放該空間,渲染以前的param入口指針無效。

只有一次釋放每個指針我不會排除此代碼中的其他泄漏:我認爲你。可以簡化您的狀態機(也可能找到其他錯誤結果)

0

也許你沒有刪除正確的免費()的?實際的問題可能在調用split_string的代碼中。你能證明嗎?

+0

這是有點脫節,但生病試圖得到相關部分 – Kracobsen 2010-11-15 15:22:42

1

當您釋放臨時緩衝區時,您還可以釋放存儲令牌的參數[]緩衝區。另一方面,如果你不打電話free(temp),你不應該這樣做,當不需要令牌時,你的函數調用者有責任調用free(param[n])

+0

我有一個功能,這樣做,我已經更新了它的問題 – Kracobsen 2010-11-15 15:28:13

0

很難理解你的代碼,我建議你使用的sscanf而不是

您可以使用格式字符串是這樣的:

"\"%[^\"]\"%n" 

瞭解它的功能。

我寫了一個例子:

if(sscanf(string, "\"%[^\"]\"%n", matchedstring, &bytesread)) 
{ 
    handlestring(matchedstring); 
    string += bytesread; 
} 
else if(sscanf(string, "%s%n", matchedstring, &bytesread)) 
{ 
    handlestring(matchedstring); 
    string += bytesread; 
} 
else 
{ 
    handleexception(); 
} 

未經檢驗。 :)

+0

謝謝我會記住這一點,如果我沒有時間重寫代碼:) – Kracobsen 2010-11-15 15:44:41

0

感謝所有評論我找到答案。 問題是for循環之前的第一個malloc是多餘的,因爲在開始將temp放入param之前會有另一個,因此沒有指向第一個malloc的指針,所以它只是丟失了。