2017-04-27 130 views
0

IF部分我已經寫了如下功能腐敗(上):雙免費或功能

/*! 
* @brief Checks if a string contains a certain keyword 
* @param char *chkstring - String to search in 
* @param char *keyword - String to search for 
* @return int - 1 if found, 0 if not found 
*/ 

int check_string(char *chkstring, char *keyword) 
{ 
    char *buffer; 
    char *buffer2; 
    buffer = malloc(256); 
    buffer2 = malloc(256); 
    strcpy(buffer2,chkstring); 

    if((buffer = strstr(buffer2,keyword)) != NULL)  // Check for first appearance of keyword in chkstring 
    { 
     //free(buffer); // <- Problem sits here         
     //free(buffer2); // and/or here 
     return 1;          // if something is found, return 1 
    } 
    else 
    { 
     free(buffer);         // else return 0 
     free(buffer2); 
     return 0; 
    } 
} 

如果我有問題的部分運行它註釋掉我得到一個

雙免費或腐敗(頂部)

錯誤。爲什麼是這樣?函數返回的部分不應該釋放內存嗎?或者我搞砸了if參數,並且都使用了這兩個指令 - 這是我不希望的,因爲代碼的工作原理與其他方式相同。

感謝您的幫助理解此事!

+5

'buffer = strstr(buffer2,keyword)'後不能再有'free(buffer)'。只能'釋放''malloc'給你的價值。 –

+3

作爲一種獎勵,只要你做了'buffer = strstr(buffer2,keyword))',你也從'buffer = malloc(256)'泄露了內存。看看這個代碼,*沒有*它似乎是有保證的。你實際上是在用一堆不需要的不必要的內存管理來包裝'strstr'。 *所有這些應該可以簡單替換,'return strstr(chkstring,keyword)!= NULL;' – WhozCraig

回答

3

檢查strstr的返回值。

返回值

一個指針,指向在str2指定的字符的整個序列,或一個null指針的STR1的第一次出現,如果該序列不存在於str1

這意味着如果在str1中找到str2,則它將返回該位置的地址。

而當你free(buffer)你實際上釋放str1而不是先前分配的內存。

而且你不需要buffer = malloc(256);

編輯:正如其他人所指出的,你不需要任何的緩衝區

int check_string(char *chkstring, char *keyword) 
{ 
    //No need for buffers. Simply check in original string and return accordingly 

    if(strstr(chkstring,keyword) != NULL)  // Check for first appearance of keyword in chkstring 
    { 
     return 1;          // if something is found, return 1 
    } 
    else 
    { 
     return 0; 
    } 
} 

類似的事情可以通過僅僅1線

return (strstr(chkstring,keyword) != NULL) 
//But then why do you need function if you only want if string exists or not. 
實現
+0

根據@WhozCraig的評論,可以將check_string的內容減少爲包含不等式的單個return語句。 (儘管包含了「if」,對於那些新到C的人來說可能更具可讀性) –