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

时间:2019-03-10 22:49:01

标签: 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以及以给定的容量分配的元素数组返回一些新分配的堆。” / p>

不能完全确定elements数组。它应该包含指向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;
}

2 个答案:

答案 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];