【问题标题】:Allocating memory for Heap with mallocs使用 malloc 为堆分配内存
【发布时间】:2019-05-06 16:12:45
【问题描述】:

我在声明一个具有最大“容量”大小的新堆时遇到问题。

堆结构:

typedef struct {
    /* number of elements on vector */
    int size;
    /* vector max size */
    int capacity;
    /*vector of pointers for elements*/
    element_t** elements;
} heap;

Element_t 结构:

typedef struct element_
{
    char nameItem[100];
    char expirationDate[11];
    int qty;
    int sellRate;
    float priorityVal;
} element_t;

我需要创建堆的函数是这样声明的,其中参数容量是堆容量。

heap* new_heap(int capacity){

在堆中插入元素的函数:

int heap_insert(heap *h, element_t* elem)
{
    element_t * aux;
    int i;
    //gilc
    if(!h) return 0;
    /* if heap is full, dont insert element */
    if (h->size >= h->capacity)
        return 0;

    if (!elem)
        return 0;

    /* insert element in the end of the heap */
    h->size++;
    i = h->size;
    h->elements[i] = elem;

    /* while element has more prioritary than his father, trade them */
    while (i != ROOT && bigger_than(h->elements[i], h->elements[FATHER(i)]))
    {
        aux = h->elements[FATHER(i)];
        h->elements[FATHER(i)] = h->elements[i];
        h->elements[i] = aux;
        i = FATHER(i);
    }
    return 1;

    //Default
    return 0;
}

FATHER 和 ROOT 是这样定义的(我不明白这是什么意思,也是为项目预定义的)

#define FATHER(x)       (x/2)
#define ROOT        (1)

和bigger_than 像这样:

int bigger_than(element_t* e1, element_t* e2)
{
    if (e1 == NULL || e2 == NULL)
    {
        return 0;
    }

    return e1->priorityVal > e2->priorityVal;
}

我需要使用哪些 malloc 调用?函数 new_heap 必须为指定为参数容量的元素数量分配所有必要的内存。

【问题讨论】:

  • 请edit 您的问题添加更多信息:您是否希望函数new_heap 为指定为参数capacity 的元素数量分配所有必要的内存?您是否需要使用指针向量element_t **elements?否则,我建议使用简单的指针 element_t *elements 并将其用作大小为 int capacity 的动态分配数组。
  • 已编辑,指针向量 element_t **elements 是什么意思?
  • @RicardoSilva 我的回答应该在您编辑后对您有用。
  • @RicardoSilva 我刚刚从您的代码中引用了注释/*vector of pointers for elements*/。使用“指针向量”,您将需要指针数组的内存和指针应该指向的所有元素的内存。您要么必须为单个element_t 分配capacity 倍的内存,要么必须分配一个可以容纳element_t 的capacity 元素的数组。而且您必须为指针数组中的所有指针分配正确的地址。
  • 我考虑过使用 element_t *elements 但这是一个学校项目,我无法更改结构的声明方式...

标签: c


【解决方案1】:
heap *new_heap(int capacity) {
    heap *h = malloc(sizeof(heap));
    h->size = 0;
    h->capacity = capacity;
    h->elements = malloc(capacity * sizeof(element_t *));
    return h;
}

第一个 malloc 将为您的堆结构腾出足够的空间。第二个是指向元素的指针的“向量”(如您所说),因为这些需要存储在内存中的单独位置(基于您对heap 的声明)。这共同分配了堆所需的所有内存。我假设您还将拥有一个 new_element 函数,该函数将在您想向 heap 添加内容时为您分配单个元素的内存。

【讨论】:

  • @Bodo 是的。我假设当他向堆中添加元素时,他已经为它们分配了内存。您是否建议我在这里为每个元素分配内存,然后在我想添加元素时就地更改它们?
  • 我应该声明什么来为实际的 element_t 结构分配内存?因为我已经在项目中提供了一个预先声明的函数来插入元素,并且这些函数在添加元素时不会分配必要的内存
  • @RicardoSilva 在您的问题中,您应该显示插入元素的函数。
  • @RicardoSilva 如果这个答案解决了您的问题,您可以通过检查它左侧的灰色复选标记来接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2013-02-23
  • 2015-11-09
  • 2021-12-15
  • 2012-12-26
  • 2021-10-31
相关资源
最近更新 更多