繁体   English   中英

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

[英]Initializing an array of pointers to structs containing a double pointer in c

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

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对象的指针(引用)。 我不确定在这里是否做得正确。 为了创建一个保存对Entry对象的引用的数组,我声明了一个双指针数组(由于Entry中有一个指针),然后我迭代地初始化了元素,然后将新创建的堆的elements指针设置为的指针。我刚刚构建的** elements数组。

我没有收到任何编译错误,但老实说,我不知道我是否正确执行了此操作。 任何投入将不胜感激。 我进行了一些搜索,但找不到用我的双指针数组Entry** elements定义结构的情况。

另外,到目前为止, Entry** elementsEntry **elements之间的语法可以互换吗? 正如它们都在声明一个数组,其中包含类型为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;
}

您还需要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* 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);

您似乎从未为Entry**类型的elements分配内存。 星号的位置与回答最后一个问题无关紧要! 他们在声明双指针,因此实际上是在声明2D数组或Entry指针数组,而不是“持有类型为Entry的双指针的数组”。

Entry** elements[capacity]; 也应该是Entry** elements[capacity] = malloc(sizeof(Entry*) * capacity)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM