【发布时间】:2014-11-19 16:53:55
【问题描述】:
当我在将foo 中的normalizedWord 传递给AddElement 后释放normalizedWord 时,尝试使用key 执行strcmp 时出现段错误。没有释放,除了巨大的内存泄漏之外,没有任何问题。知道这里可能发生了什么吗?
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;
}
【问题讨论】:
-
也许
Normalize做了坏事? -
缺少以下信息: 1. 函数
Normalize的实现。 2. 调用函数foo。 3、全局变量dict的声明、实例化和初始化。 -
在
CreateElement()中,您需要将新元素的next指针设置为NULL...AddElement()可能正试图越过列表末尾移动到无效节点。 -
一些编码建议: 1. 尽量避免使用全局变量。 2.摆脱
if (constant value == something)的约定。的确,它是“发明”的,目的是防止您误用=而不是==,但这只会使代码的可读性降低。确保使用==来保护自己。 3. 在同一个问题上,从if (NULL == (element = ...)))语句中取出赋值。 -
4.避免转换
malloc的返回值。 5. 当您在代码中的其他任何地方与NULL进行适当比较时,为什么还要使用if (0 == hashTable->elements[hashIndex])?
标签: c memory-management memory-leaks free