当前位置: 首页 > 知识库问答 >
问题:

C语言中void指针的自由数组

艾照
2023-03-14

我正在用C实现一个最小/最大堆,并试图在一般情况下实现它,因为我在将来的项目中需要它。

我们的想法是使用一个1D数组void*和一个通用比较器int(*cmp)(void*,void*)

我的结构如下所示:

typedef struct heap {
    size_t capacity;
    size_t size;
    int (*cmp)(void *, void *);
    void **data;
} Heap;

在调用heapalloc时,我为void**data分配空间:

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

共有1个答案

祁柏
2023-03-14
Heap* h = malloc(sizeof(Heap*));

是错误的;你想要

Heap *h = malloc(sizeof *h);
 类似资料:
  • C 语言的指针常常被人们认为是 C 语言中的灵魂所在,可以完成很多高难度的操作。但是更多的人感觉 C 语言的指针的存在如同噩梦一般,因为稍不注意,就会引起灾难性的后果。 不管你是不是喜欢 C 语言中的指针,我们都要学习这种看起来很神奇的东西。因为指针这个概念不是 C 语言首创的,而是苏联的计算机科学家首创的。 1. 什么是指针? 指针是什么?这是来自灵魂的拷问。其实指针也是一种变量。我们之前也说过

  • 本文向大家介绍C语言 函数指针(指向函数的指针)详解,包括了C语言 函数指针(指向函数的指针)详解的使用技巧和注意事项,需要的朋友参考一下 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就

  • 多级指针概述 我们将指针变量理解为一个存储地址的变量。如果这个地址里面存储的依然是地址,那么我们就可以定义一个二维指针。通过一个二维指针,我们通过两次寻址操作就可以找到这个值。 比如我们定义一个int **p;这是一个二维指针,当编译器看到p的时候,它知道这是一个指针变量,指向一个地址;当它看到第二个的时候,它知道指向的地址里面依然还是地址。如下图所示: 如果我们将p[0]和p[1]分别指向两个字

  • 我们已经在内存中看到了int类型的存储方式,如果我们存储的是0x12,就会在内存中得到二进制的编码0001 0010。如果我们存储一个float类型的1.2,又在内存中又有怎样的存储方式呐?下面我们使用两种方法来读取存储在内存中的float变量。 用int类型的指针来读取同样大小的四个字节 测试代码如下 我们可以看到由于不同的指针类型赋值,依然有一个警告。 运行结果如下 这就是浮点数1.2在内存中

  • 下面为了让大家更好的理解上面两个概念,我们来举几个例子来查看一下。 解释第一个概念:大小一样的盒子存储指针 代码如下 我们声明了两个类型的变量,它们的类型是不同的。我们通过sizeof来查看这两个指针变量的大小。 #include <stdio.h> int main(){ int *p1; char *p2; printf("the p1 is %u, th

  • 今天我们进入到嵌入式C语言高级部分的第三个内容-C内存空间的使用。 学习目的 在本章内容中,我们将给大家展示一下C语言对于内存空间指向和内存空间使用上的一些技巧。在我们上一个阶段中,我们只是明白了C语言给我们带来的关键字和运算符。但是C语言的核心-操作内存资源的方式方法,这些我们没有介绍。在本个学习阶段,我们将重点围绕C语言访问内存空间的方式,以及访问空间需要使用的一些技巧来展开。 指针介绍 之前