2014-01-05 4 views
0

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

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

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

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

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 list node i find, чтобы ввести указатель на соответствующий узел.

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 ** Темп держать безопасную NODET и после проверки, если все в порядке, я снова поставил температуру в 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

Вы не выделить достаточно памяти на здесь:

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.

Смежные вопросы