2013-11-24 87 views
0

我有一個C數據結構,它由嵌套的一系列鏈表組成。想象一下吧。爲什麼我在嘗試編輯此鏈接列表時遇到Seg錯誤

[]->[]->[]->[]->[] 
| 
V 
[]->[]->[]->[]->[] 
| 
V 
[]->[]->[]->[]->[] 
| 
V 
[]->[]->[]->[]->[] 

頂級節點具有這樣

typedef struct _StackTop 
{ 
    struct _StackTop *next; 
    StackNode *head; 
} StackTop; 

凡StackNode是一個指向下級列表的頭,它具有這樣的

typedef struct _StackNode 
{ 
    int number; 
    struct _StackNode *next; 
} StackNode; 

對於部分的結構的結構的業務邏輯,我需要更改頂層指向哪個節點,即更改StackNode *頭。

這似乎是合理的。

然而,當我嘗試和執行的代碼如下:

*注意stackKing是第一個頂級節點

StackTop *currStackNode = &stackKing; 

currStackNode->head = currStackNode->head->next; 

我得到一個賽格故障。

起初,我想到了編輯頂級節點的問題。但是,如果我將其設置爲別的東西

currStackNode->head = NULL; 

一切都很好。我甚至可以改變它指向的內容。

currStackNode->head = currStackNode->next->head; 

沒有問題。我很不習慣動態分配數據系統,所以我真的很希望有一些非常明顯的我做錯了,但我還沒有能夠縮小它在谷歌或SO。

我期待在由Valgrind的產生的信息,我還沒有100%確定這是什麼意思

==5038== Invalid read of size 4 
==5038== at 0x8048955: cachesim_access (in /home/rrollins/3056/Assignment- 5/assignment5/cachesim) 
==5038== by 0x40604D2: (below main) (libc-start.c:226) 
==5038== Address 0x4 is not stack'd, malloc'd or (recently) free'd 
==5038== 
==5038== 
==5038== Process terminating with default action of signal 11 (SIGSEGV) 
==5038== Access not within mapped region at address 0x4 

聽起來也許這意味着有一個與我的初始化錯誤,因爲我試圖訪問一些內存不正確malloc'd?

由於一些意見和我自己的分析表明初始化的問題,下面的代碼,以及

i = 0; 
    j = 0; 
    StackTop *currStackNode = &stackKing; 
    currStackNode->next = NULL; 
    currStackNode->head = NULL; 
    StackNode *innerCurrStackNode; 
    //for each set 
    while (i<numSets) { 
    //create a linked list of StackNodes, one for each "way" 
    j = 0; 
    while (j<assoc) { 
     if (j == 0) { 
     currStackNode->head = malloc(sizeof(StackNode)); 
     innerCurrStackNode = currStackNode->head; 
     } else { 
     innerCurrStackNode->next = malloc(sizeof(StackNode)); 
     innerCurrStackNode = innerCurrStackNode->next; 
     } 
     //set this to negative 1, to show that no number is least recently used 
     innerCurrStackNode->number = -1; 
     innerCurrStackNode->next = NULL; 
     j++; 
    } 
    currStackNode->next = malloc(sizeof(StackTop)); 
    currStackNode = currStackNode->next; 
    currStackNode->next = NULL; 
    currStackNode->head = NULL; 
    i++; 
    } 
} 

但是,我沒有問題,「迭代」通過每個鏈表。它只是試圖設置這個值,創建一個嚴重的問題

+0

看起來'currStackNode-> head-> next'沒有正確初始化。 – Leigh

回答

0

currStackNode->head->next否則,當currStackNode->next->head沒有,向我說明currStackNodehead指針可能是不正確初始化,或在某處怪異指指點點,所以當第一線上面試圖參考head->,它會導致段錯誤。

+0

不幸的是,我不認爲這是正確的。 StackNode * stackTemp = currStackNode-> head-> next; stackTemp = stackTemp-> next; // currStackNode-> head = stackTemp; 工作正常。直到最後一行,這再次導致段錯誤 –

相關問題