传递值导致EXC_BAD_ACCESS后释放内存

时间:2014-11-19 16:53:55

标签: c memory-management memory-leaks free

当我将normalizedWord传递给foo之后,AddElementkey传递给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}}

2 个答案:

答案 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()可能会解决此细分问题。