簡體   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