c - 传递值后释放内存导致 EXC_BAD_ACCESS

标签 c memory-management memory-leaks free

当我将 foo 中的 normalizedWord 传递给 AddElement 后,我在尝试使用 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;
}

最佳答案

除了 Illuminatus pr 指出的未初始化的 element->next 之外,您在分配的内存的大小 方面也存在问题。声明

Element* element = malloc(sizeof(element));

为一个指针分配足够的内存,而不是为实际元素分配内存。你需要写的是这样的:

Element* element = malloc(sizeof(*element));

唯一的区别是额外的星号,它可以区分分配八个字节还是一千字节。

关于c - 传递值后释放内存导致 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27022459/

相关文章:

c++ - 如何将使用 malloc() 的 C 语句转换为 C++?

objective-c - 如何通过重用单个 viewcontroller 加载 xibs 并处理内存警告?

C-strdup内存泄漏

c++ - 在单个分配中分配一个包含字符串的结构

c++ - 如何开始 Linux 编程

c++ - 如何使用二进制搜索将所有重复的字符串打印在排序数组中?

c - rand() 的合适替代品是什么?

memory-management - 如何在 Chapel 中产生一个 nilable 共享对象?

javascript - 处理数组时可能发生 JavaScript 内存泄漏?

c - 在c中制作具有特定宽度和高度的钻石(gnuplot)