我有以下 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 指標。但是,我有泄漏,而不是因為我錯誤地釋放了記憶體。分配的第 2 行似乎是多余的(?),如果我將 Hash_Table 替換為
typedef struct Hash_Table{
struct Bucket* bucket[10];
}Table;
,則不需要第 2 行,一切正常,記憶體已釋放。我真的不知道我做錯了什么。我發現了錯誤,但首先沒有看到錯誤。謝謝你們。
uj5u.com熱心網友回復:
您發布的沒有“第 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;
}
如果你在底部添加了正確的 free,你就不應該有記憶體泄漏。至少Valgrind是這么說的。
注意:對于每一個寫malloc在你的代碼中,你至少需要 1 個free
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372826.html
上一篇:在C中將多維陣列作為引數傳遞
下一篇:展平MongoDB嵌套物件
