2017-04-27 79 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的人来说可能更具可读性) –