【问题标题】:Why I am getting a Seg Fault When I Try to Edit This Linked List为什么我在尝试编辑此链接列表时遇到 Seg 错误
【发布时间】: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-&gt;head-&gt;next 似乎没有正确初始化。

标签: c linked-list segmentation-fault


【解决方案1】:

currStackNode-&gt;head-&gt;next 失败,当currStackNode-&gt;next-&gt;head 没有失败时,向我表明currStackNodehead 指针可能没有正确初始化,或者指向某个奇怪的地方,所以当上面的第一行尝试引用@ 987654325@,导致段错误。

【讨论】:

  • 不幸的是,我不认为这是正确的。 StackNode *stackTemp = currStackNode->head->next; stackTemp = stackTemp->下一个; //currStackNode->head = stackTemp;工作正常。直到最后一行,再次导致段错误
猜你喜欢
  • 1970-01-01
  • 2023-01-01
  • 2021-12-20
  • 1970-01-01
  • 2013-08-14
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多