我有一个程序可以在任何
的大小时动态增加哈希表的容量
它的桶超出了最大值。然而,我被一个“ * glibc
检测到* realloc():“当我尝试运行我的代码时出错。
有人可以帮我解决这个问题吗?很抱歉在这里提供了这么多代码,但我真的需要
帮助。
/* structure for the hashtable containing an array of nodes */
typedef struct Hashtable hashtable;
struct Hashtable {
struct node **list;
};
/* the function which resizes the hashtable and re-arranges the values according to
new capacity */
void reSize(hashtable *h)
{
int i;
node **newlist=realloc(h->list,2*capacity*sizeof(node*));
h->list=newlist;
int temp=capacity,index;
capacity=capacity * 2;
for(i=temp;i<capacity;i++)
h->list[i]=calloc(1,sizeof(node));
}
/* mystructure init */
struct hashtable *mystruct_init()
{
int i;
hashtable *hashtable =calloc(1, sizeof(*hashtable));
// loop through and allocate memory for each element in list
hashtable->list= calloc(1,sizeof(node *));
for (i = 0; i < 16; i++) {
hashtable->list[i] = calloc(1, sizeof(node));
}
return hashtable;
}
/* in my main function */
hashtable *h1=(hashtable *) mystruct_init();
hashtable *h2=(hashtable *) mystruct_init();
我得到这个“ * glibc检测到* ./compareDocs:realloc():”我尝试时出错 运行它。有人可以指出我的代码在哪里出错吗?我花了 整晚试图调试这个东西,所以任何帮助都会非常好。对于某事很抱歉 张贴了这么多行代码..
答案 0 :(得分:3)
您将分配一个长度为capacity
的数组。然后在读取capacity=capacity * 2
的行上加倍容量。然后你在for循环中编写数组的结尾,因为数组的长度只有你想象的一半。
node **newlist=realloc(h->list,capacity*sizeof(node*));//array of length capacity
h->list=newlist;
....
capacity=capacity * 2;//oops, capacity is now twice as big as the array
for(i=temp;i<capacity;i++)
h->list[i]=calloc(1,sizeof(node));//and now we are writing off the end
}
您的代码中很可能存在其他错误。我无法看到如何处理capacity
变量。它是全球性的吗?它初始化在哪里?
此外,您在编辑中添加的代码显然是错误的。
hashtable->list= calloc(1,sizeof(node *));
for (i = 0; i < 16; i++) {
hashtable->list[i] = calloc(1, sizeof(node));
}
在这里,您似乎将列表的初始容量设置为1,但随后分配16个值。显然,calloc
应该通过16
而不是1
。
答案 1 :(得分:1)
在你的mystruct_init()函数中,你只为你的列表分配了一个node *
:
hashtable->list= calloc(1,sizeof(node *));
然后继续在已分配内存的末尾取消引用元素:
for (i = 0; i < 16; i++) {
hashtable->list[i] = calloc(1, sizeof(node));
此外,在reSize()函数中,您使用可变容量,但似乎没有在任何地方定义。这是你的真实代码吗?如果是,那么容量的价值是多少?
编辑:你应该让init函数中的代码看起来像这样:
struct hashtable *mystruct_init()
{
int i;
hashtable *hashtable =calloc(1, sizeof(*hashtable));
// loop through and allocate memory for each element in list
hashtable->list= calloc(capacity, sizeof(node *));
for (i = 0; i < capacity; i++) {
hashtable->list[i] = calloc(1, sizeof(node));
}
return hashtable;
}
请注意,我在调用calloc()时使用了容量,并在下面的for循环中使用了控制值。