双结构指针的分配
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 Bucket
? struct 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 指针