C函数初始化并显示给出分段错误的单链表

C function to initialize and display singly linked list giving segmentation fault

我的函数出现分段错误,我不明白为什么。 如果 list_initialize 的 return 类型是 List 本身,它工作得很好。但我需要 return 类型为 void 并且程序仍然有效。

#include <stdio.h>
#include <stdlib.h>
typedef struct List List;
typedef struct Node Node;

struct Node {
    int data;
    struct Node *link;
};

struct List {
    Node *head;
    int number_of_Nodes;
};

void list_initialize(List* ptr_list) 
{
    ptr_list = (List*)malloc(sizeof(List)); 
    (ptr_list)->head = NULL;
    (ptr_list)->number_of_Nodes = 0;
    return;
}

void list_print(List* list) 
{
    Node *p;
    p=list->head;
    if(p == NULL)
    {
        printf("EMPTY\n");
        return;
    }
    while (p!=NULL)
    {
        printf("%d ",p->data);
        p=p->link;
    }
    printf("\n");
}

void main() 
{
    List *list;
    list_initialize(list);
    list_print(list);
}

您在第 27 行 (p = list->head;) 遇到分段错误,试图使用空指针。正如潜伏者提到的 list_initialize 按值获取参数,因此它没有修改其输入参数,因此在您的 main 变量中 list 始终为空。

可能以下代码有效,

#include <stdio.h>
#include <stdlib.h>
typedef struct List List;
typedef struct Node Node;

struct Node {
  int data;
  struct Node *link;
};

struct List {
  Node *head;
  int number_of_Nodes;
};

void list_initialize(List** pptr_list)
{
  List* ptr_list = (List*)malloc(sizeof(List));
  (ptr_list)->head = NULL;
  (ptr_list)->number_of_Nodes = 0;
  *pptr_list = ptr_list;
  return;
}

void list_print(List* list)
{
  Node *p;
  p = list->head;
  if (p == NULL)
  {
    printf("EMPTY\n");
    return;
  }
  while (p != NULL)
  {
    printf("%d ", p->data);
    p = p->link;
  }
  printf("\n");
}

int main()
{
  List *list = nullptr;
  list_initialize(&list);
  list_print(list);
}