链接列表中节点的地址会在c

时间:2016-07-17 14:18:33

标签: c pointers linked-list

我正在学习c中的指针并编写了一个程序,它将元素插入到链表中并最终打印出来。

// this is exercise 2 in chapter 11 on pointers
#include <stdio.h>
#include <stdbool.h>

typedef struct node
{
   int value;
   struct node * next;
}node;

/**
Insert into linked list
**/

bool insert(node * list, int n);

void printList(node *startNode);

int main(void)
{
    node n1,n2;
    n1.value  = 0;
    n2.value  = 1;
    n1.next   = &n2;
    n2.next   = NULL;
    // insert 2 into list
    insert(&n1, 2);
    // print the updated list
    printList(&n1);
    printf("Program Executed Successfully \n");
    return 0;
 }

bool  insert(node * list, int n)
{
  while(list->next != NULL)
  {
    if (list->value < n)
    {
      list = list->next;
    }
    else
    {
      node tempNode;
      tempNode.value = n;
      tempNode.next = list->next;
      list->next = &tempNode ;
      return true;
    }
  }
  node tempNode;
  tempNode.value = n;
  tempNode.next = list->next;
  list->next = &tempNode ;

  return false;
}

void printList(node * startNode)
{
  while(startNode->next != NULL)
  {
    printf("%i\n", startNode->value);
    startNode = startNode->next;
  }
}

插入似乎没问题。我最初有两个节点然后我再添加了一个值为2的节点,但是当我打印时,它只是正确打印前两个元素。

我使用GDB调试器并尝试跟踪问题发生的位置,我看到当它有打印机的第一个和第二个节点时,第三个节点的地址已自动更改为

  

0x7ffff7dea560&lt; _dl_fini&gt;

在打印功能开始之前它是

  

0x7ffffe018

并且完整程序的输出是

  

0

     

1

     

-777224576

     

-443987883

     

分段错误

1 个答案:

答案 0 :(得分:2)

insert函数看起来不对,但最糟糕的违规者是函数的这些行:

else
{
    node tempNode;
    ...
    list->next = &tempNode ;
}

在此声明 本地 变量`tempNode,并在列表中保存指向它的指针。一旦达到结束大括号,变量将超出范围并停止存在,留下一个迷路指针。试图取消引用该迷路指针将导致未定义的行为

再往下一点,再次犯同样的错误,保存指向局部变量的指针。