[英]Why does this malloc not work in C?
只是嘗試制作一種哈希表,每個節點都是一個鏈表。
初始化空間時遇到麻煩,我在做什么錯?
#include <stdlib.h>
typedef struct entry {
struct entry *next;
void *theData;
} Entry;
typedef struct HashTable {
Entry **table;
int size;
} HashTable;
int main(){
HashTable *ml;
ml = initialize();
return 0;
}
HashTable *initialize(void)
{
HashTable *p;
Entry **b;
int i;
if ((p = (HashTable *)malloc(sizeof(HashTable *))) == NULL)
return NULL;
p->size = 101;
if ((b = (Entry **)malloc(p->size * sizeof(Entry **))) == NULL)
return NULL;
p->table = b;
for(i = 0; i < p->size; i++) {
Entry * b = p->table[i];
b->theData = NULL;
b->next = NULL;
}
return p;
}
您需要將sizeof(HashTable*)
更改為sizeof(HashTable)
,類似地將sizeof(Entry **)
更改為sizeof(Entry *)
。 第二件事是對於每個Entry
您需要在循環內再次使用malloc
分配內存。
if ((p = malloc(sizeof(HashTable))) == NULL)
return NULL;
p->size = 101;
if ((b = malloc(p->size * sizeof(Entry *))) == NULL)
return NULL;
我相信刪除malloc()
結果轉換是最佳實踐。
另外,正如@Naveen首先指出的那樣,您還需要為每個Entry
分配內存。
首先,您的sizeofs錯誤。 T * = malloc(num * sizeof(T))是正確的。 您也可以使用calloc。
您正在出於不同的目的重用b,所以這很令人困惑。 使用單個字符變量通常不好。
p->原來是b的表已分配但未初始化,即它沒有指向任何有用的東西,因此您嘗試取消引用它。
您需要先將其填充Entry *指針,如果要取消引用它們,它們必須指向有效的Entry結構。
您的進程可能會死於b> theData = NULL行
此外,您可以在本地或在堆棧中足夠高的某個區域中靜態聲明您的HashTable,以確保在使用該堆棧時該堆棧不升序(在內存中),並將指向HashTable的指針傳遞給您的initialize函數,以避免malloc。 malloc很慢。
因此,總的來說,您可以執行以下操作:
HashTable表; InitializeHashTable(&table);
//使用表(無需釋放)//只是不返回表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.