C中的自由数组void指针

时间:2013-12-03 22:11:58

标签: c arrays pointers malloc void

我在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 *))

1 个答案:

答案 0 :(得分:3)

Heap* h = malloc(sizeof(Heap*));

错了;你想要

Heap *h = malloc(sizeof *h);