我在C中实现了一个最小/最大堆,我正在尝试这样做,因为我将来需要它用于未来的项目。
我们的想法是使用void*
的一维数组和通用比较器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,而data是从它返回的指针!
void
heapfree(Heap *h)
{
free(h->data);
free(h);
}
任何帮助将不胜感激。我已经看过很多关于类似主题的帖子,但到目前为止我发现的任何内容都没有。 (用gcc编译;因此sizeof(void *))
答案 0 :(得分:3)
Heap* h = malloc(sizeof(Heap*));
错了;你想要
Heap *h = malloc(sizeof *h);