簡體   English   中英

為什么此malloc在C中不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM