【发布时间】:2013-11-24 03:11:41
【问题描述】:
我有一个由一系列嵌套链表组成的 C 数据结构。想象一下吧。
[]->[]->[]->[]->[]
|
V
[]->[]->[]->[]->[]
|
V
[]->[]->[]->[]->[]
|
V
[]->[]->[]->[]->[]
顶级节点具有这样的结构
typedef struct _StackTop
{
struct _StackTop *next;
StackNode *head;
} StackTop;
其中 StackNode 是指向具有如下结构的低级列表头部的指针
typedef struct _StackNode
{
int number;
struct _StackNode *next;
} StackNode;
对于部分业务逻辑,我需要更改Top Level指向的节点,即更改StackNode *head。
这似乎是合理的。
但是,当我尝试执行如下代码时:
*注意stackKing是第一个顶级节点
StackTop *currStackNode = &stackKing;
currStackNode->head = currStackNode->head->next;
我遇到了段错误。
起初,我认为问题在于编辑顶级节点。但是,如果我将其设置为其他内容
currStackNode->head = NULL;
一切都很好。我什至可以改变它指向的东西。
currStackNode->head = currStackNode->next->head;
没有问题。
我对动态分配的数据系统相当缺乏经验,所以我真的希望有一些非常明显的事情我做错了,但我无法在 google 或 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 的内存?
由于几个 cmets 和我自己的分析表明初始化是问题,这也是代码
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似乎没有正确初始化。
标签: c linked-list segmentation-fault