如何释放calloc';不从哈希表/链表中删除值的d指针?

如何释放calloc';不从哈希表/链表中删除值的d指针?,c,arrays,pointers,hashtable,calloc,C,Arrays,Pointers,Hashtable,Calloc,我正在使用链表设置并加载一个哈希表。对于每个项,我调用一个结构指针,然后将该项输入数组本身,或者如果采用数组索引,则输入关联的链表 所有的工作都很好,但是valgrind告诉我在调用结构项的行中有一个“肯定丢失了” 现在,我不熟悉C,但熟悉Objective-C。在弧前的日子里,您可以分配一个对象,将其放入数组中,然后释放它。数组将保留该对象。一旦需要将项目从阵列中拉出,就需要首先保留它。否则,它将很快丢失,因为阵列将不再保留该对象 因此,我想我的问题是:如何让数组/链表保留其“对象”,以便在将

我正在使用链表设置并加载一个哈希表。对于每个项,我调用一个结构指针,然后将该项输入数组本身,或者如果采用数组索引,则输入关联的链表

所有的工作都很好,但是valgrind告诉我在调用结构项的行中有一个“肯定丢失了”

现在,我不熟悉C,但熟悉Objective-C。在弧前的日子里,您可以分配一个对象,将其放入数组中,然后释放它。数组将保留该对象。一旦需要将项目从阵列中拉出,就需要首先保留它。否则,它将很快丢失,因为阵列将不再保留该对象

因此,我想我的问题是:如何让数组/链表保留其“对象”,以便在将alloc'd项输入数组或链表后释放它

// global array
struct_item** hashtable;

// declare struct
typedef struct struct_item
{
    char item1[SIZE + 1];
    struct struct_item* next_item;
}

// later... dynamically allocate hashtable
hashtable = calloc(sizevar, sizeof(struct_item);

// later, inside of a loop...
// alloc struct item to go into array/linked list (valgrind error happening here)
struct_item* an_item = calloc(1, sizeof(struct_item);

// after setting appropriate values in 'an_item', add struct to hashtable
hashtable[0] = an_item;

// after all is said and done, free the current (remaining) struct_item
// (edit to fix: wasn't struct_item; should've been an_item)
//free(struct_item);
free(an_item);
我不会释放循环期间调用的任何其他结构项;就最后一个。但是,一旦我释放了它,它的值就会从哈希表中消失

理想情况下,我想我会释放每个calloc的struct_项,是吗?Valgrind只报告了一个问题,位于我调用“an_item”的行中

那么,同样,我如何让calloc的项与哈希表保持关联,这样我就可以释放“an_项”,而不让它的数据从表中消失?我错过了什么


编辑以添加注释:在卸载哈希表/链表时,我确实释放了struct_项

这一行有问题

// after all is said and done, free the current (remaining) struct_item
free(struct_item);
更改为“an_item”包含calloc返回的地址

  free(an_item);
找到了

在卸载过程中,我从链表中释放了所有内容——但不是当前哈希表索引中的实际项目

一旦我正确地释放了hashtable[I],我就得到了令人高兴的报告:

==6759== 
==6759== HEAP SUMMARY:
==6759==     in use at exit: 0 bytes in 0 blocks
==6759==   total heap usage: 143,130 allocs, 143,130 frees, 14,883,824 bytes allocated
==6759== 
==6759== All heap blocks were freed -- no leaks are possible
==6759== 
==6759== For counts of detected and suppressed errors, rerun with: -v
==6759== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

对不起,谢谢你指出这一点——这本应该是这样的。编辑我的帖子以更正。使用已释放的地址是未定义的行为。你要么接受这个,要么改变你的设计。是的,我知道,马特。我发现在卸载过程中正确释放项目是我所需要的。谢谢