繁体   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