gpt4 book ai didi

c - 函数的 IF 部分中的双重释放或损坏(顶部)

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:34 25 4
gpt4 key购买 nike

我写了下面的函数:

/*!
* @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;
}
}

如果我在有问题的部分未注释的情况下运行它,我会得到一个

double free or corruption (top)

错误。为什么是这样?函数返回的部分不应该释放内存吗?或者我搞砸了 if 参数并且使用了两个指令 - 我不希望这样,因为代码按预期工作。

感谢您帮助理解这件事!

最佳答案

检查 strstr的返回值。

Return Value

指向 str2 中指定的整个字符序列在 str1 中第一次出现的指针,或者如果序列不存在于 str1 中则为 null 指针

这意味着如果在 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.

关于c - 函数的 IF 部分中的双重释放或损坏(顶部),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43652482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com