[英]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.