传递值后释放内存,导致EXC\u访问错误
当我在传递值后释放内存,导致EXC\u访问错误,c,memory-management,memory-leaks,free,C,Memory Management,Memory Leaks,Free,当我在foo中释放normalizedWord并将其传递到AddElement后,当我尝试使用键执行strcmp时,会出现segfault。没有释放,就没有问题,除了一个巨大的内存泄漏。知道这里发生了什么吗 foo(char* word) { char* normalizedWord = (char*)(malloc(strlen(word) + 1); strcpy(normalizedWord, word); Normalize(normalizedWord);
foo
中释放normalizedWord
并将其传递到AddElement
后,当我尝试使用键执行strcmp时,会出现segfault。没有释放,就没有问题,除了一个巨大的内存泄漏。知道这里发生了什么吗
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;
}
我可以看到的一个问题是元素->下一个在创建元素时没有初始化。很明显,next
不是静态成员,因此当添加第一个元素时,其next
值将包含垃圾。正因为如此,current
通过以下代码段被分配了一些垃圾值:
else
{
current = current->next;
}
导致strcmp()中的段外内存访问
添加元素->下一步=NULLCreateElement()
函数中的code>可能会修复此分段错误。除了Illuminatus pr指出的未初始化的元素->下一个
之外,您在分配的内存大小方面存在问题。声明
Element* element = malloc(sizeof(element));
为一个指针分配足够的内存,而不是为实际元素分配足够的内存。你需要写的是这样的:
Element* element = malloc(sizeof(*element));
唯一的区别是额外的星号,它可以决定分配8个字节还是1个KB。也许Normalize
做了坏事?缺少以下信息:1。实现函数规范化
。2.调用函数foo
。3.声明、实例化和初始化全局变量dict
。在CreateElement()
中,需要将新元素的next
指针设置为NULLAddElement()
可能正试图从列表末尾移到无效节点。以下是一些编码建议:1。尽可能避免使用全局变量。2.摆脱那种if(常量值==something)
惯例。诚然,它被“发明”是为了保护您不被错误地使用=
而不是=
,但它只是使代码的可读性大大降低。通过确保使用==
来保护自己。3.在同一问题上,将赋值从if(NULL==(element=…)
语句中去掉。避免强制转换malloc
的返回值。5.当您与代码中的任何其他地方的NULL
进行适当比较时,为什么要使用if(0==hashTable->elements[hashIndex])
?正如Dmitri在上面的评论中指出的,这肯定是个问题。将选择您的作为正确答案,因为Dmitri尚未提交答案。谢谢你看。这就解释了我在瓦尔格林看到的一些情况。