我正在用C实现一个最小/最大堆,并尝试在一般情况下实现它,因为我在未来的项目中需要它。
其想法是使用void*
的1D阵列和通用比较器int (*cmp) (void*,void*)
。
我的结构如下:
typedef struct heap {
size_t capacity;
size_t size;
int (*cmp)(void *, void *);
void **data;
} Heap;
我在对heapalloc:的调用中为void **data
分配了malloc空间
Heap*
heapalloc(size_t capacity, int (*cmp)( void *, void *))
{
Heap* h = malloc(sizeof(Heap*));
if (h == NULL)
{
perror("heapalloc/h:");
return h;
}
h->cmp = cmp;
h->data = malloc(capacity * sizeof(void*) );
if (h->data == NULL)
{
perror("heapalloc/h->data:");
free(h);
return NULL;
}
h->size = 0;
h->capacity = capacity;
return h;
}
一切都很顺利,直到我不得不释放数据。下面的调用给出了一个seg错误,我不明白为什么——我只调用过malloc一次,数据就是从它返回的指针!
void
heapfree(Heap *h)
{
free(h->data);
free(h);
}
如有任何帮助,我们将不胜感激。我看过很多关于类似主题的帖子,但到目前为止,我没有发现任何真正有效的帖子。(使用gcc编译;因此sizeof(void*))
Heap* h = malloc(sizeof(Heap*));
是错误的;你想要
Heap *h = malloc(sizeof *h);