我有一个包含以下结构定义的标头类:
struct Entry {
int key;
char *value;
};
typedef struct Entry Entry;
struct Heap {
int capacity;
int size;
Entry **elements;
};
typedef struct Heap Heap;
而且,我正在尝试编写一个函数makeHeap
,该函数“返回一个指针,该指针以给定的容量,大小为0以及以给定的容量分配的元素数组返回一些新分配的堆。” / p>
不能完全确定elements数组。它应该包含指向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;
}
答案 0 :(得分:1)
您还需要分配堆中的元素,您不能只在函数中为其分配数组,因为一旦makeHeap()函数退出,它将变为无效。这是经过更正的代码:
if re.search('\d{3}.*\d{3}.*\d{4}', line):
Phone = re.findall('\d{3}.*\d{3}.*\d{4}', line)
Phone = ''.join(Phone)
PhoneLst.append(Phone)
注意:完成后,请确保释放所有内容:
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;
}
答案 1 :(得分:0)
您似乎从未为类型elements
的{{1}}分配内存。星号的位置与回答最后一个问题无关紧要!他们在声明双指针,因此实际上是在声明2D数组或Entry指针数组,而不是“持有类型为Entry的双指针的数组”。
Entry**
也应为Entry** elements[capacity];
。