我有一個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++;
}
}
但是,我沒有問題,「迭代」通過每個鏈表。它只是試圖設置這個值,創建一個嚴重的問題
看起來'currStackNode-> head-> next'沒有正確初始化。 – Leigh