双免费或功能
问题描述:
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参数,并且都使用了这两个指令 - 这是我不希望的,因为代码的工作原理与其他方式相同。
感谢您的帮助理解此事!
答
检查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的人来说可能更具可读性) –
'buffer = strstr(buffer2,keyword)'后不能再有'free(buffer)'。只能'释放''malloc'给你的价值。 –
作为一种奖励,只要你做了'buffer = strstr(buffer2,keyword))',你也从'buffer = malloc(256)'泄露了内存。看看这个代码,*没有*它似乎是有保证的。你实际上是在用一堆不需要的不必要的内存管理来包装'strstr'。 *所有这些应该可以简单替换,'return strstr(chkstring,keyword)!= NULL;' – WhozCraig