为什么这个malloc在C中不起作用?

时间:2010-10-26 11:18:44

标签: c pointers malloc

只是尝试制作一种哈希表,每个节点都是一个链表。

在初始化空间时遇到麻烦,我做错了什么?

#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;
}

4 个答案:

答案 0 :(得分:9)

您需要将sizeof(HashTable*)更改为sizeof(HashTable),将sizeof(Entry **)更改为sizeof(Entry *)。第二件事是每个Entry你需要在循环内再次使用malloc分配内存。

答案 1 :(得分:1)

 if ((p = malloc(sizeof(HashTable))) == NULL) 
  return NULL; 
 p->size = 101;  

 if ((b = malloc(p->size * sizeof(Entry *))) == NULL) 
         return NULL; 

我认为删除malloc()结果广告是最佳做法。

另外,正如@Naveen首先指出的那样,你还需要为每个Entry分配内存。

答案 2 :(得分:0)

首先你的sizeofs错了。 T * = malloc(num * sizeof(T))是正确的。您也可以使用calloc。

您正在重复使用b用于不同目的,因此非常混乱。使用单个字符变量通常不太好。

p-&gt;表b是分配但未初始化的,即它没有指向任何有用的东西,那么你试图取消引用它。

你需要首先填充Entry *指针,如果要取消引用它们,它们必须指向有效的Entry结构。

您的流程可能会在第b行&gt; theData = NULL

上消失

答案 3 :(得分:0)

此外,您可以静态地声明您的HashTable,无论是本地还是在堆栈中足够高的某个区域,堆栈在使用时是非升序(在内存中)并将指向HashTable的指针传递给初始化函数避免使用malloc。 malloc很慢。

所以在主要方面,你可以这样做:

HashTable表; InitializeHashTable(安培;表);

//使用表格(无需免费) //只是不要返回表