2014-01-05 78 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列表節點,輸入一個指向正確節點的指針。

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再次,否則我停止PROGRAMM。最後,我通過像這樣的陣列指針打印列表的內容

for(i=0 ; i<nodeT->table_size ; i++) 
    printf("-> %d ", nodeT->table[i]->num); 
printf("\n"); 

我退出程序。在這個悖論是,對於X 1-4一切工作正常,但對於5+有一個問題,我收到一條消息

「** glibc detected * ./dynamix_table_realloc:realloc():invalid next大小: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