【问题标题】:Allocation of double struct pointer双结构指针的分配
【发布时间】: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 Bucketstruct Hash_Table 没有名为 hash_buckets 的成员。
  • 请发布 C minimal reproducible example 演示“我有泄漏”。 谈论代码是好的,只有真正兼容的 C 代码包含在内。
  • 没有类型Hash_Table支持Hash_Table** hash_tables = [...]。如果代码被编译为 C++,则需要转换 malloc() 的结果。重要的是要清楚你是在编写 C 还是 C++,并适当地指导你的工具。这些是不同的语言,不是其他语言的子集。

标签: c pointers struct malloc


【解决方案1】:

您发布的没有“第 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

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2021-12-11
    • 2016-04-01
    • 1970-01-01
    • 2015-07-04
    • 2020-05-06
    • 2020-11-15
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多