初始化指向c中包含双指针的结构的指针数组

初始化指向c中包含双指针的结构的指针数组,c,arrays,pointers,C,Arrays,Pointers,我有一个包含以下结构定义的头类: struct Entry { int key; char *value; }; typedef struct Entry Entry; struct Heap { int capacity; int size; Entry **elements; }; typedef struct Heap Heap; 我正在尝试编写一个函数makeHeap,该函数“返回一个指针,指向某个新分配的具有给定容量、大小为0的堆,以及一

我有一个包含以下结构定义的头类:

struct Entry {
    int key;
    char *value;
};

typedef struct Entry Entry;

struct Heap {
    int capacity;
    int size;
    Entry **elements;
};

typedef struct Heap Heap;
我正在尝试编写一个函数
makeHeap
,该函数“返回一个指针,指向某个新分配的具有给定容量、大小为0的堆,以及一个具有给定容量的元素数组。”

元素数组是我不能完全确定的。它应该包含指向入口对象的指针(引用)。我不确定我在这里做的是否正确。为了创建一个包含对条目对象引用的数组,我声明了一个双指针数组(因为条目中有一个指针),然后迭代初始化元素,然后将新创建的堆的元素指针设置为我刚才构建的**元素数组的指针

我没有得到任何编译错误,但我真的不知道我是否做得正确。如有任何意见,将不胜感激。我做了一些搜索,但找不到结构的定义方式与双指针数组
Entry**elements
完全相同的情况

此外,就
Entry**元素
Entry**元素
之间的语法而言,这些元素是否可以互换?正如在中一样,它们都声明了一个数组,该数组包含
Entry
类型的双指针

Heap *makeHeap(int capacity) {
    //Make the heap
    Heap* theHeap = calloc(1, sizeof(Heap));
    //set its capacity to param
    theHeap->capacity = capacity;
    //inital size is 0
    theHeap->size = 0;
    //elements contains pointers (references) to Entry objects.
    Entry **elements[capacity];
    //iterate capacity times allocating an entry reference for each element to be placed
    int i = 0;
    for (; i < capacity; i++) {
       elements[i] = calloc(1, sizeof(Entry));
    }

    theHeap->elements = *elements;

    return theHeap;
}
Heap*makeHeap(int容量){
//堆积如山
Heap*theHeap=calloc(1,sizeof(Heap));
//将其容量设置为param
堆->容量=容量;
//初始大小为0
heap->size=0;
//元素包含指向条目对象的指针(引用)。
条目**要素[容量];
//迭代容量时间,为要放置的每个元素分配一个入口引用
int i=0;
对于(;ielements=*元素;
返回堆;
}

您似乎从未为
条目**
类型的
元素分配过内存。星号的位置与回答最后一个问题无关!他们在声明双指针,所以实际上是在声明2D数组或入口指针数组,而不是“保存Entry类型双指针的数组”


条目**元素[容量]
也应该是
Entry**elements[capacity]=malloc(sizeof(Entry*)*capacity)

您还需要malloc堆的元素,您不能只在函数中为其分配一个数组,因为一旦makeHeap()函数退出,它将变得无效。以下是您的代码和更正:

Heap* makeHeap(int capacity) {
//Make the heap
Heap* theHeap = calloc(1, sizeof(Heap));
//set its capacity to param
theHeap->capacity = capacity;
//inital size is 0
theHeap->size = 0;
//elements contains pointers (references) to Entry objects.
theHeap->elements = calloc(capacity,sizeof(Heap*));
//iterate capacity times allocating an entry reference for each element to be placed
int i = 0;
for(; i < capacity; i++) {
   theHeap->elements[i] = calloc(1, sizeof(Entry));
}

return theHeap;
}
Heap*makeHeap(int容量){
//堆积如山
Heap*theHeap=calloc(1,sizeof(Heap));
//将其容量设置为param
堆->容量=容量;
//初始大小为0
heap->size=0;
//元素包含指向条目对象的指针(引用)。
Heap->elements=calloc(容量,sizeof(Heap*));
//迭代容量时间,为要放置的每个元素分配一个入口引用
int i=0;
对于(;ielements[i]=calloc(1,sizeof(Entry));
}
返回堆;
}
注意:完成后,请确保释放所有内容:

Heap* test = makeHeap(10);

//Do your stuff with the heap...

for(size_t i = 0;i<test->capacity;i++){
        //Note: free the 'char* value' if you malloced them
    free(test->elements[i]);
}
free(test->elements);
free(test);
Heap*test=makeHeap(10);
//用堆做你的东西。。。
对于(大小i=0;icapacity;i++){
//注意:如果对“char*value”进行malloced,则释放它们
自由(测试->元素[i]);
}
免费(测试->元素);
免费(测试);

调用
makeHeap
函数时,您的
元素
数组实际上是在堆栈上分配的。这实际上是不正确的,因为当函数返回时,数组将从堆栈中移除,因此堆实例将指向堆栈上不再存在的位置。您还可以通过在堆上创建元素数组来解决此问题。@wuppie367感谢您向我指出这一点!回答得很好。我忘了提到需要像您一样释放堆内存。@Mini谢谢。由于我无法对您的答案发表评论,因此最好添加条目**元素[容量]之间的区别;和条目**元素=malloc(sizeof(条目*)*容量)。第一个将在堆栈上分配,第二个在堆上分配,这对于变量的生存期来说有很大的不同。非常感谢您的澄清,我已经为这件事挣扎了一段时间,但通过大量的搜索却一无所获。真的很感谢你,没问题。你能接受这个答案作为解决办法吗?我是新来的,我想获得更多的声誉积分!:)谢谢@绝对是安托尼安伯特!至少我能做到。再次感谢!也感谢这里的澄清。一组入口指针比我想象的更有意义。