[英]Initialization of dynamic array of structs
這是我的結構:
typedef struct ElementToInsert {
char *key;
char *value;
} element;
這是我的功能:
void init_hash(int size, element**arr) {
*arr = malloc(size * sizeof(element*));
if (arr == NULL)
{
printf("Out of memory\n");
return 0;
}
for (int i = 0; i < size; i++) {
(*arr)[i].key = NULL;
(*arr)[i].value = NULL;
}
}
而main()
:
void main() {
element *hash_table = NULL;
int hash_table_size = 10;
init_hash(hash_table_size, &hash_table);
}
問題是,當我運行調試器(在 Visual Studio 2015 中)時,它沒有顯示所有數組值。 我希望看到類似的東西: hash_table[0] = {key = NULL, value = NULL}, hash_table[1] = {key = NULL, value = NULL}
但我看到的是:
將雙指針傳遞給init_hash
是不必要的復雜。 雖然雙指針有很多有效的用途,但這不是其中之一。 通常雙指針用於多個輸出變量或換出現有內存,但由於您沒有返回值並且無論如何您都在分配內存,它只會引發錯誤。 保持簡單並返回指向元素列表的指針。
element *init_hash(size_t size) {
element *hash = calloc(size, sizeof(element));
if (hash == NULL) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
return hash;
}
一些注意事項。 首先是分配一個結構數組,你分配size * sizeof(element)
。 這為size
結構分配內存。 如果您使用size * sizeof(element*)
為指向 struct 的size
指針分配內存。 兩者都是有效的,但您必須選擇要使用的那個。 您似乎正在使用結構列表。
與malloc
不同, calloc
將為您清零內存。 這避免了手動將每個結構歸零的需要,從而節省了一些代碼和時間。
如果您的內存不足,並且您沒有計划來處理它,那么最好只為自己保存大量后續錯誤消息並exit
。
最后,尺寸最好存儲為size_t
。 這是 C 用於數組大小的類型,它可以捕獲一些類型問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.