我正在学习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
分段错误
答案 0 :(得分:2)
insert
函数看起来不对,但最糟糕的违规者是函数的这些行:
else
{
node tempNode;
...
list->next = &tempNode ;
}
在此声明 本地 变量`tempNode,并在列表中保存指向它的指针。一旦达到结束大括号,变量将超出范围并停止存在,留下一个迷路指针。试图取消引用该迷路指针将导致未定义的行为。
再往下一点,再次犯同样的错误,保存指向局部变量的指针。