bool check(const char *word)
{
int length = strlen(word);
//malloc size of char times length of word plus \0
char *lower_case = malloc(sizeof(char) * (length + 1));
lower_case[length + 1] = '\0';
//change characters to lowercase
for (int i = 0; i < length; i++)
{
lower_case[i] = tolower(word[i]);
}
//generate int hash
int index = generate_hash(lower_case);
node_ptr trav = hashtable[index];
while (trav != NULL)
{
if (strcmp(trav->word, lower_case) == 0)
{
return true;
}
trav = trav -> next;
}
free(lower_case);
return false;
}
我从Valgrind测试中泄漏了27个字节的内存;如何释放它?
答案 0 :(得分:1)
lower_case[length + 1] = '\0';
写越界,更改为[length]
。#include <stdlib.h>
和其他必要内容。return true;
时都会造成内存泄漏。您应该能够按照以下步骤修正代码:
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
bool check (const char *word)
{
size_t length = strlen(word);
char* lower_case = malloc(length + 1);
if(lower_case == NULL)
{
return false;
}
//change characters to lowercase
for (size_t i = 0; i < length; i++)
{
lower_case[i] = tolower(word[i]);
}
lower_case[length] = '\0';
//generate int hash
int index = generate_hash(lower_case);
bool result = false;
for(const node* trav = hashtable[index]; trav!=NULL; trav=trav->next)
{
if (strcmp(trav->word, lower_case) == 0)
{
result = true;
break;
}
}
free(lower_case);
return result;
}
需要将类型node_ptr
更改为node
,而无需隐藏指针。
答案 1 :(得分:0)
在malloc
之后,有一个越界访问。
在这里,您正在访问范围之外
lower_case[length + 1] = '\0';
应该是:
lower_case[length] = '\0';
检查malloc
是否也失败也是明智的选择!
如注释中所述,从循环内部返回时,还可能发生内存泄漏。您需要在那里释放
if (strcmp(trav->word, lower_case) == 0)
{
free(lower_case);
return true;
}