传递值后释放内存,导致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
指针设置为NULL
AddElement()
可能正试图从列表末尾移到无效节点。以下是一些编码建议:1。尽可能避免使用全局变量。2.摆脱那种
if(常量值==something)
惯例。诚然,它被“发明”是为了保护您不被错误地使用
=
而不是
=
,但它只是使代码的可读性大大降低。通过确保使用
==
来保护自己。3.在同一问题上,将赋值从
if(NULL==(element=…)
语句中去掉。避免强制转换
malloc
的返回值。5.当您与代码中的任何其他地方的
NULL
进行适当比较时,为什么要使用
if(0==hashTable->elements[hashIndex])
?正如Dmitri在上面的评论中指出的,这肯定是个问题。将选择您的作为正确答案,因为Dmitri尚未提交答案。谢谢你看。这就解释了我在瓦尔格林看到的一些情况。