我正在为家庭作业创建哈希表。我使用Xcode并没有立即出现任何错误,但是当我尝试运行它时,当涉及最初创建哈希表并分配的函数时,我得到其中一个线程1:EXC_BAD_ACCESS错误为了它。特别是使用malloc的行:
Node **ht_create(void)
{
Node **hashtable[htsize];
int Node_size = sizeof(Node);
if( htsize < 1 )
{
printf("Error: please enter adequate size for hashtable");
return NULL;
}
for (int i = 0; i<=htsize;i++)
{
hashtable[i] = malloc(Node_size);
}
if( ( **hashtable) == NULL )
{
printf("Error: could not allocate memory for hashtable");
return NULL;
}
return *hashtable;
}
我还是C的新手,我2个月前才开始学习它,所以如果有明显的问题而且我只是个白痴,请耐心等待我。 htsize
是一个在其他地方声明的整数命令行参数。我不知道它是否有帮助,但这里的代码定义了我的节点&#39;结构:
struct NodeType
{
char *key;
int value;
struct NodeType *next;
};
typedef struct NodeType Node;
在黑暗中拍摄:它是否与我在结构中有指针的事实有关? struct NodeType *next;
部分?
任何帮助将不胜感激,提前谢谢。
编辑:我现在拥有它所以它为表中的每个节点分配一个for循环,但它返回我的&#34;错误:无法为散列表分配内存&#34;所以我的哈希表现在是= NULL?
答案 0 :(得分:0)
**hashtable = malloc(Node_size * htsize);
这是两次取消引用哈希表,然后将其分配给malloc返回的指针。您应该将指针哈希表分配给malloc返回的指针。
e.g。
hashtable = malloc(Node_size * htsize);
编辑:我重读了您的代码。您不应该将哈希表声明为数组。阵列的存储持续时间是本地的;函数返回后,数组将被释放。你无论如何都只返回第一个元素,所以它可能只是一个错字。
您还应该return hashtable
,而不是return *hashtable
更新:您已经更改了为散列表数组的每个元素分配节点的方法,但您只返回该数组的第一个元素。
Node **hashtable[htsize];
应更改为Node **hashtable;
您无法返回具有自动存储类的数组,因此将其声明为数组似乎是一个错误。
此外,您只返回此数组的第一个元素,因此导致内存泄漏return *hashtable
等同于返回hashtable[0]
。
我认为这是您正在寻找的行为:
Node **ht_create(void)
{
Node **hashtable;
if(htsize < 1)
{
printf("Error: please enter adequate size for hashtable");
return NULL;
}
hashtable = malloc(htsize * sizeof(Node*)) //allocate the array
if(hashtable == NULL )
{
printf("Error: could not allocate memory for hashtable");
return NULL;
}
for (int i = 0; i < htsize; i++)
{
hashtable[i] = malloc(sizeof(Node)); //allocate each node in the array
if(hashtable[i] == NULL) //you have to null check these too
{
printf("Error: could not allocate memory for hashtable");
return NULL;
}
}
return hashtable; //return the array of node pointers
}
如果分配失败,您应该解除分配所有其他节点,除非您在此时仍然要退出程序。您可以随心所欲地解决这个问题,因为这取决于您如何实施其余代码。
答案 1 :(得分:0)
不完全清楚OP的意图,但我希望Node **ht_create(void)
创建并返回指向Node *
数组的指针,因此返回类型Node **
。然后数组元素将初始化为NULL
,因为每个哈希表桶的开头都是空列表。
提示:分配内存的简便方法。
Some_type *pointer = malloc(sizeof *pointer * array_size);
示例代码:
Node **ht_create(size_t htsize) { // pass in size
if (htsize < 1) {
printf("Error: please enter adequate size for hashtable");
return NULL;
}
//allocate hashtable
Node **hashtable = malloc(sizeof *hashtable * htsize);
if (hashtable == NULL) {
printf("Error: could not allocate memory for hashtable");
return NULL;
}
// Initialize values
for (size_t i=0; i<htsize; i++) {
hashtable[i] = NULL;
}
return hashtable;
}