链表C程序中的分段错误

时间:2017-10-05 14:04:41

标签: c linked-list segmentation-fault

我正在尝试创建一个包含10个节点的列表,并使用值1到10进行分配并打印它们。我尝试使用以下代码,但最终我遇到了分段错误。

我对C中的链接列表很新。

#include<stdio.h>
typedef struct Node
{
  int data;
  struct Node *next;
}Node_Struct;

int main(void)
{
 int i =0;
 Node_Struct* Node = NULL;
 Node = (Node_Struct*)malloc(sizeof(Node_Struct));

 for (i = 1; i<=10; i++){
    Node->data = i;
    Node       = Node->next;
 }

  for (i = 1; i<=10; i++){
    printf("\n Node->data:%d",Node->data);
    Node = Node->next;
  }
 return 0;
}

4 个答案:

答案 0 :(得分:1)

正如评论中的人所指出的那样,你只是将内存分配给头节点。您需要为您尝试添加的每个节点分配内存,以及for循环。此外,您在每次迭代时向前移动Node指针,因此在插入后您将无法遍历列表。跟踪列表的头部和尾部。执行以下操作:

维护链表的头尾:

 Node_Struct* headNode = NULL, *tailNode = NULL;
 // head node
 headNode = tailNode = (Node_Struct*)malloc(sizeof(Node_Struct));

在循环中的每次迭代中分配内存。您是否想要保留头节点中的内容,这是您的愿望。所以改变for循环中的代码如下:

for (i = 1; i<=10; i++) {
   Node_Struct* newNode = (Node_Struct *)malloc(sizeof(Node_Struct));

   newNode->data = i;
   newNode->next = NULL;

   tailNode->next = newNode;
   tailNode = newNode;
}

在此之后,您可以通过在其他变量中复制head值来迭代列表:

  Node_Struct *tmpNode = headNode;
  for (i = 1; i<=10; i++){
    printf("\n Node->data:%d",tmpNode->data);
    tmpNode = tmpNode->next;
  }

答案 1 :(得分:1)

您没有为每个添加的节点分配内存。

如果要使用你的循环,那么就足以进行这些微小的改变

Node_Struct* Node = NULL;
Node_Struct **current = &Node;

for (i = 1; i <= 10; i++ ) {
    *current = malloc(sizeof(Node_Struct));
    (*current)->data = i;
    (*current)->next = NULL;
    current = &(*current)->next;
}

current = &Node;
for (i = 1; i <= 10; i++) {
    printf("\n Node->data:%d", ( *current )->data);
    current = &( *current )->next;
}

考虑到在退出程序之前应该为节点释放所有已分配的内存。

答案 2 :(得分:0)

您只为一个节点分配了空间,但是您尝试通过这样做来遍历链接节点列表:

for (i = 1; i<=10; i++){
    Node->data = i;
    Node       = Node->next;
 }

执行此操作时,Node = Node->next;Node可能指向任何地方。你可能指着你不应该触摸的记忆。

要记住的一件事是永远不要把手柄放到列表的头部。通过保留副本来保持指向列表头部的指针。

Node = malloc(sizeof(Node_Struct));
Node_Struct *head = Node;

使用malloc()为每个节点分配空间。首先构建节点列表。一种方法是这样的:

for (i = 1; i<=10; i++){
    Node->next = malloc(sizeof (Node_Struct));
    Node       = Node->next;
}
Node->next = NULL    // The last node should point to NULL

之后,您可以在另一个循环中设置节点的所有data字段,或者在执行malloc()时将它们设置在同一个循环中。由于您已经拥有列表head的句柄,因此您知道从哪里开始。像这样:

Node = head;
i = 0;
while (Node) {
    Node->data = i++;
    Node = Node->next;
}

答案 3 :(得分:0)

首先,我告诉你你的错误在哪里,我已经重新编写了代码来解决你的问题。查看我的代码并与您的代码进行比较。希望能帮助您学习数据结构。

让我们看看你的错误

#include<stdio.h>
typedef struct Node
{
  int data;
  struct Node *next;
}Node_Struct;

int main(void)
{
  int i =0;
  Node_Struct* Node = NULL;
  Node = (Node_Struct*)malloc(sizeof(Node_Struct));

 for (i = 1; i<=10; i++){
     Node->data = i;/* till here everything fine */
     Node       = Node->next; /* now you are pointing to nowhere */
     /* in the next iteration of for loop Node->data = i will crash the application */
   /* you could have done it like below
     Node->next = (Node_Struct*)malloc(sizeof(Node_Struct));
     Node       = Node->next;
     Node->data = i;
     Node->next = NULL
     but here you lost the address of first node so all gone*/

 }

     for (i = 1; i<=10; i++){
     printf("\n Node->data:%d",Node->data);
     Node = Node->next;
  }
  return 0;
}

现在看下面的代码

int main(void)
{
    int i =0;
    Node_Struct *Node = NULL;
    Node_Struct *p = NULL;

    for (i = 1; i<=10; i++){
    if ( Node == NULL )
    {
         Node = (Node_Struct*)malloc(sizeof(Node_Struct));
         Node->data = i;
         Node->next = NULL;
         p = Node; /* p is pointing to the first Node of the list */
       }
       else
       {
           p->next = (Node_Struct*)malloc(sizeof(Node_Struct));
           p = p->next;
           p->data = i;
           p->next = NULL;
        }
  }

        p = Node; /* now p is pointing to first node of the link list */
         /* if you see above we always assign NULL to 'next' pointer so that the last node of the list    pointing to NULL */
        /* Therefore in the below while loop we are searching the list untill we reach the last node */
        while( p != NULL )
        {
            printf("\n p->data:%d",p->data);
            p = p->next;
         }
      return 0;
  }