【发布时间】:2022-01-06 15:04:08
【问题描述】:
我有以下 Hash_table 和 Hash_bucket 结构
typedef struct Hash_Table{
struct Bucket** bucket;
}Table;
typedef struct Bucket{
struct Bucket* next;
int num;
}Bucket;
我想分配 5 个我喜欢的哈希表,
Table** hash_tables = malloc(sizeof(Table*)* 5);
for(int i = 0; i <=4 ; i++){
hash_tables[i] = NULL;
}
据我所知,我在这里所做的是正确的,我想继续在我的代码中分配哈希表。正如我对上面的双指针所做的那样,我对哈希表的分配
hash_table[0] = malloc(sizeof(Table));
hash_table[0]->bucket = malloc(sizeof(Bucket*)*10); /* line 2 that is problematic*/
我为 Hash_Table 分配大小,然后分配 10 个 Hash_Bucket 指针。但是,我有泄漏并且 NOT 因为我错误地释放了内存。分配的 第 2 行 似乎是多余的(?),如果我将 Hash_Table 替换为
typedef struct Hash_Table{
struct Bucket* bucket[10];
}Table;
,则不需要第 2 行,一切正常,内存已释放。我真的对我做错了什么一无所知。我发现了错误,但一开始就没有看到错误。谢谢大家。
【问题讨论】:
-
“我有泄漏”。你是怎么确定的? “不是因为我释放了错误的内存””。你怎么能确定这一点,因为根据定义你在这里是因为你不知道问题出在哪里?我们需要能够看到这一点验证码。请提供完整的代码minimal reproducible example。
-
为什么你认为这个“第2行”是多余的?你还在哪里分配你的
Hash_Bucket指针数组? -
什么是
struct Bucket?struct Hash_Table没有名为hash_buckets的成员。 -
请发布 C minimal reproducible example 演示“我有泄漏”。 谈论代码是好的,只有真正兼容的 C 代码包含在内。
-
没有类型
Hash_Table支持Hash_Table** hash_tables = [...]。如果代码被编译为 C++,则需要转换malloc()的结果。重要的是要清楚你是在编写 C 还是 C++,并适当地指导你的工具。这些是不同的语言,不是其他语言的子集。