带有指向结构节点的指针的动态数组

时间:2014-01-05 13:59:21

标签: c arrays pointers struct dynamic-data

我在使用C中的某些代码时出现问题,我真的需要你的帮助。好吧,我有这两个结构(他们被要求这样,所以我们不能改变它们)

struct node{
    struct list_node **table;
    int table_size;
};

struct list_node{
    int num;
    struct list_node *ptr;
};

正如你在第一个中看到的那样,我们有一个数组,在列表的节点中有指针。在main中,我们创建所需的内存空间,就像这样开始

struct node *nodeT;
struct list_node *root, *curr, **temp;

root = (struct list_node*)malloc(sizeof(struct list_node));       // root node of list

nodeT = (struct node*)malloc(sizeof(struct node));                // single node
nodeT->table = (struct list_node**)malloc(sizeof(struct list_node*)); 
nodeT->table_size = 0;

然后我创建了列表

for(i=0 ; i<X ; i++){     // X is important for the errors and i'll explain why
  curr = (struct list_node*)malloc(sizeof(struct list_node));
  curr -> num = (i+1);
  curr -> ptr = root;
  root = curr;
}

现在,我浏览列表,然后在我发现的everysingle列表节点的第一个结构中展开数组,输入指向正确节点的指针。

for(curr=root ; curr!=NULL ; curr=curr->ptr){               

  nodeT->table[nodeT->table_size] = curr;
  nodeT->table_size++;

  temp = (struct list_node**)realloc(nodeT->table , nodeT->table_size*sizeof(struct list_node *));
  if(temp!=NULL)
      nodeT->table = temp;
  else{
     printf("Memory error\n");
    return 1;
  }
}

我使用这个struct list_node ** temp来保持安全nodeT,并且在检查之后,如果一切正常,我再次将temp放入nodeT,否则我停止该程序。最后,我通过像

这样的数组指针打印列表的内容
for(i=0 ; i<nodeT->table_size ; i++)
   printf("-> %d ", nodeT->table[i]->num);
printf("\n");

然后退出程序。这方面的悖论是,对于X 1-4,一切正常,但对于5+,有一个问题,我得到一条消息

“** glibc检测到 * ./dynamix_table_realloc:realloc():下一个大小无效:0x0000000000819050 *

还有大约20多行,这些并不能帮助我。我希望你会,这就是为什么我发布这个。提前谢谢!

1 个答案:

答案 0 :(得分:1)

你没有在这里分配足够的内存:

temp = (struct list_node**)realloc(nodeT->table , nodeT->table_size*sizeof(struct list_node *));

应该是:

temp = (struct list_node**)realloc(nodeT->table , (nodeT->table_size+1)*sizeof(struct list_node *));

您使用realloc()为下一个元素添加空间,但在nodeT->table_size++之后,nodeT->table->size的值是下一个元素的索引,因为C数组索引从零开始,因此元素的数量应为nodeT->table_size + 1

这是典型的off-by-one error