双结构指针的分配

Posted

技术标签:

【中文标题】双结构指针的分配【英文标题】: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++,并适当地指导你的工具。这些是不同的语言,不是其他语言的子集。 【参考方案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

【讨论】:

以上是关于双结构指针的分配的主要内容,如果未能解决你的问题,请参考以下文章

双指针将 char 数组值分配给 char 数组,结构使用 char 指针

为具有双指针的结构内的动态结构数组分配内存**

将二维数组分配为结构成员

为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?

使用双指针为结构成员赋值

如何为数组分配双指针? C/C++