当我尝试编辑此链接列表时,为什么会出现Seg错误

时间:2013-11-24 03:11:42

标签: c linked-list segmentation-fault

我有一个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++;
  }
}

但是,我没有问题“迭代”通过每个链表。它只是试图设置这个值造成一个严重的问题

1 个答案:

答案 0 :(得分:0)

currStackNode->head->next失败,当currStackNode->next->head没有时,向我表明currStackNode的{​​{1}}指针可能未正确初始化,或指向某处奇怪,所以当上面的第一行试图引用head,它会导致段错误。