这是我的结构:
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}
的内容,但我看到的只有:
答案 0 :(得分:0)
将双指针传递给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*)
为结构的size
指针分配内存。两者都有效,但你必须选择你正在使用的那个。您似乎正在使用结构列表。
与malloc
不同,calloc
会将内存归零。这样就无需手动将每个结构清零,从而节省了一些代码和时间。
如果内存不足,而您没有计划处理它,最好自己保存大量后续错误消息并exit
。
最后,尺寸最好存储为size_t
。它是C用于数组大小的类型,它可以捕获一些类型问题。