为什么printf会在链表中引起段错误?

时间:2020-10-13 13:39:40

标签: c linked-list segmentation-fault

我的代码采用一串由空格分隔的整数,并根据它们构建一个链表,但-1除外。为什么打印nextNode -> data会导致段错误?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node Node;
struct node {
  int data;
  Node *next;
};

void build_linked_list(Node **head_ptr) {
  char *string = malloc(1028);
  char *p = string, *found = string;
  Node *nextNode = NULL;
  if (fgets(string, 1028, stdin) != NULL) {
    while ((found = strsep(&p, " \n")) != NULL) {
      if (strcmp(found, "-1") == 1) {
        Node *node = malloc(sizeof(Node));
        node->data = atoi(found);
        node->next = nextNode;
        nextNode = node;
      }
    }
  }
  *head_ptr = nextNode;
  printf("%i\n", nextNode->data); //error here
  free(string);
}

int main() {
  Node *head = NULL;
  build_linked_list(&head);
  return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:1)

无论如何,您都尝试打印nextNode->data,但是如果nextNodeNULL怎么办?尝试访问无效指针的成员将导致分段错误。

详细信息:

  1. 您初始化指向NULL

    的指针
    Node *nextNode = NULL;
    
  2. 您更新了指针,但仅在某些条件下

    if (fgets(string, 1028, stdin) != NULL) {
      while ((found = strsep(&p, " \n")) != NULL) {
        if (strcmp(found, "-1") == 1) {
          /* ... */
          nextNode = node;
        }
      }
    }
    
  3. 您打印字段

     printf("%i\n", nextNode->data); //error here
    

    但是如果不满足条件,则指针可能仍为NULL

要解决此问题,请在取消引用之前检查指针:

if( nextNode )
{
    printf("%i\n", nextNode->data);
}
else
{
    printf("NULL nextnode\n");
}

答案 1 :(得分:1)

在阅读nextNode != NULL之前,您没有检查nextNode->data是否是

strcmp(3) - Linux manual page

strcmp()返回表示比较结果的整数, 如下:

   · 0, if the s1 and s2 are equal;

   · a negative value if s1 is less than s2;

   · a positive value if s1 is greater than s2.

两个字符串不同时从strcmp()返回的内容不必是1,因此strcmp(found, "-1") == 1是一个错误的表达式,用于检查found是否不是{{1} }。

您的环境中似乎-1返回的是strcmp()以外的东西,并且没有执行插入操作,因此1NULL处取消引用,从而导致分段错误。

尝试一下:

nextNode->data