我有一个C数据结构,由一系列嵌套链表组成。想象一下。
[]->[]->[]->[]->[]
|
V
[]->[]->[]->[]->[]
|
V
[]->[]->[]->[]->[]
|
V
[]->[]->[]->[]->[]
顶级节点有这样的结构
typedef struct _StackTop
{
struct _StackTop *next;
StackNode *head;
} StackTop;
其中StackNode是指向低级列表头部的指针,该列表具有类似
的结构typedef struct _StackNode
{
int number;
struct _StackNode *next;
} StackNode;
对于部分业务逻辑,我需要更改顶级指向哪个节点,即更改StackNode * head。
这似乎是合理的。
但是,当我尝试按如下方式执行代码时:
*请注意,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的内存?
由于它有几条评论和我自己的分析表明初始化是问题所在,这里的代码也是
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 :(得分:0)
currStackNode->head->next
失败,当currStackNode->next->head
没有时,向我表明currStackNode
的{{1}}指针可能未正确初始化,或指向某处奇怪,所以当上面的第一行试图引用head
,它会导致段错误。