使用realloc函数时出错

时间:2012-02-02 16:00:49

标签: c

我有一个程序可以在任何
的大小时动态增加哈希表的容量 它的桶超出了最大值。然而,我被一个“ * 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():”我尝试时出错 运行它。有人可以指出我的代码在哪里出错吗?我花了 整晚试图调试这个东西,所以任何帮助都会非常好。对于某事很抱歉 张贴了这么多行代码..

2 个答案:

答案 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循环中使用了控制值。