创建链接列表中的C ++分段错误

时间:2013-07-02 06:02:03

标签: c++ linked-list

我正在尝试在链表的末尾插入一个新节点。但是,当我尝试时,我会在插入点处出现分段错误。我知道首选方法是'head - >下一个'风格,但对于任务,我们长期坚持做。帮助

谢谢!

#include <iostream>
using namespace std;

struct NodeType;
typedef NodeType *NodePtr;

struct NodeType
{
   int data;
   NodePtr next;
};

int main ()
{
   NodePtr head;
   NodePtr temp;
   NodePtr tempTwo;
   NodePtr tempThree;
   NodePtr tempFour;

   head = new NodeType;
   (*head).data = 5;
   (*head).next = NULL;

   temp = new NodeType;
   (*temp).data = 8;
   (*temp).next = head;
   head = temp;
   delete temp;

   tempTwo = new NodeType;
   (*tempTwo).data = 12;
   (*tempTwo).next = NULL;
   head -> next -> next = tempTwo;
   delete tempTwo;






}

4 个答案:

答案 0 :(得分:4)

delete temp;
delete tempTwo;

删除这些行。您正在删除分配的内存,以便下次通过head访问时获得 segfault

你需要delete你分配的内存块,这应该在你完成内存使用后发生。您不需要delete每个接触该内存的变量。

在你的情况下,你可以在main函数的末尾创建一个循环,逐个删除元素(你需要先保存next指针)

答案 1 :(得分:1)

当你这样做时

head = temp; // head and temp point to same object
delete temp; // object temp points to is de-allocated

删除temp指向的对象,该对象与head指向的对象相同。然后你在这里取消引用head

head -> next -> next = tempTwo;

head并未指出任何有效的内容。取消引用它是未定义的行为。

答案 2 :(得分:1)

在代码中

 temp = new NodeType;
   (*temp).data = 8;
   (*temp).next = head;
   head = temp;
   delete temp;

删除分配给head的内容。所以这里head指向垃圾。因此,行head -> next -> next = tempTwo;会为您提供细分错误。您正在分配无效的位置。

答案 3 :(得分:0)

   head = temp;
   delete temp;

- 您删除指针并稍后将其推迟

   head -> next -> next = tempTwo;