双结构指针的分配

Allocation of double struct pointer

我有以下 Hash_table 和 Hash_bucket 结构

typedef struct Hash_Table{
   struct Bucket** bucket;
}Table;

typedef struct Bucket{
   struct Bucket* next;
   int num;
}Bucket;

我想分配 5 个哈希 Table,我喜欢这样,

Table** hash_tables = malloc(sizeof(Table*)* 5);
for(int i = 0; i <=4 ; i++){
  hash_tables[i] = NULL;
} 

据我所知,到目前为止我所做的是正确的,我想继续在我的代码中分配哈希 Table。正如我对上面的双指针所做的那样,我对 Hash Table

的分配
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 行就不需要了,一切正常,内存也被释放了。我真的不知道我做错了什么。我发现了错误,但首先没有看到错误。谢谢大家

您发布的没有“第 2 行是多余的”部分的代码应该如下所示:

typedef struct Bucket {
struct Bucket* next;
int num;
} Bucket;
    
typedef struct Hash_Table {
struct Bucket** bucket;
} Table;
    
int main(void)
{
// Create hashtable
Table** hash_tables = malloc(sizeof(Table*) * 5);
for (int i = 0; i <= 4; i++) {
hash_tables[i] = NULL;
}
    
// Create Bucket
hash_tables[0] = malloc(sizeof(Table));
hash_tables[0]->bucket = malloc(sizeof(Bucket*)*10); /* line 2 that is problematic*/
    
free(hash_tables[0]->bucket);
free(hash_tables[0]);
free(hash_tables);
return 0;
}

如果您在底部添加正确的空闲空间,您就不会出现内存泄漏。 至少 Valgrind 这么说。

注意:您的代码中每写入一个 malloc,您至少需要 1 个 free