gpt4 book ai didi

c - 为什么当我尝试编辑此链接列表时出现段错误

转载 作者:行者123 更新时间:2023-11-30 17:43:49 24 4
gpt4 key购买 nike

我有一个由一系列嵌套链表组成的 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;

没有问题。

我对动态分配的数据系统相当缺乏经验,所以我真的希望有一些非常明显的我做错的事情,但我无法在谷歌或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

听起来这可能意味着我的初始化有错误,因为我正在尝试访问一些尚未正确分配的内存?

由于一些评论和我自己的分析表明初始化是问题所在,因此这也是该代码

  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 失败,当 currStackNode->next->head 没有失败时,向我表明 currStackNode' head 指针可能未正确初始化,或者指向奇怪的地方,因此当上面的第一行尝试引用 head-> 时,它会导致段错误。

关于c - 为什么当我尝试编辑此链接列表时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com