динамический массив с указателями на узлы структуры

У меня проблемы с некоторым кодом на C, и мне очень нужна ваша помощь. Ну, у меня есть эти 2 структуры (их просят быть такими, поэтому мы не можем их изменить)

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;
}

теперь я просматриваю список и расширяю массив в первой структуре для каждого найденного узла списка, чтобы ввести указатель на нужный узел.

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;
  }
}

я использую эту структуру 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 строк, которые мне не очень помогают. Я надеюсь, что вы, и именно поэтому я разместил это. Заранее спасибо!


person user3162585    schedule 05.01.2014    source источник


Ответы (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.

Это типичная ошибка "выход за один".

person Lee Duhem    schedule 05.01.2014