[英]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** elements
和Entry **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.