当我将normalizedWord
传递给foo
之后,AddElement
将key
传递给foo(char* word)
{
char* normalizedWord = (char*)(malloc(strlen(word) + 1);
strcpy(normalizedWord, word);
Normalize(normalizedWord);
int result = AddElement(dict->hashTable, normalizedWord);
free(normalizedWord);
return result;
}
AddElement(HashTable *hashTable, const char *key)
{
if (0 == hashTable->elements[hashIndex])
{
// Add new element
hashTable->elements[hashIndex] = CreateElement(key);
}
else
{
// Search for existing or Add new element
Element* current = hashTable->elements[hashIndex];
/* ERROR HERE... */
while (0 != strcmp(current->key, key))
{
if (NULL == current->next)
{
current->next = CreateElement(key);
break;
}
else
{
current = current->next;
}
}
}
return 0;
}
Element* CreateElement(const char* key)
{
Element* element;
if (NULL == (element = malloc(sizeof(element))))
{
return NULL;
}
element->key = (char*) malloc(strlen(key) + 1);
strcpy(element->key, key);
return element;
}
时,我尝试使用{{1}}进行strcmp时会出现段错误。没有释放,除了巨大的内存泄漏之外没有任何问题。知道这里可能会发生什么吗?
{{1}}
答案 0 :(得分:2)
除了Illuminatus pr指出的未初始化的element->next
之外,您所分配的内存的 size 也存在问题。声明
Element* element = malloc(sizeof(element));
为一个指针分配足够的内存,而不是为实际元素分配。你需要写的是这样的:
Element* element = malloc(sizeof(*element));
唯一的区别是额外的星号,它可以区分八个字节或一千字节。
答案 1 :(得分:0)
我可以看到的一个问题是element->next
在创建元素时未初始化。很明显next
不是静态成员,因此当添加第一个元素时,其next
值将包含垃圾。因此,current
通过以下代码部分分配了一些垃圾值:
else
{
current = current->next;
}
导致strcmp();
中的段内存访问在element->next=NULL;
函数中添加CreateElement()
可能会解决此细分问题。