使用链接列表和字符数组时出现分段错误

时间:2014-04-19 18:41:11

标签: c linked-list malloc arrays

我正在努力完成我的编程功课,需要一个链接列表。基本上我们必须创建一个包含某些功能来管理链表的程序。相当标准。我上周尝试过,但是无法得到它。我试图让这个周末工作,并且在我遇到分段错误之前取得了很好的进展。

struct STUDENT
{
  char *FirstName;
  char *LastName;
  char *PUID;
  int age;
  struct STUDENT *next;
};

这是我正在尝试使用的结构。前三个值是char数组,第四个值只是一个数字。在此之后,我尝试全局声明一个起始和当前节点。

struct STUDENT *head = NULL;
struct STUDENT *curr = NULL;

接下来我有了我的创建节点功能,它接受用户输入并将其放入列表中。

void *createListNode()
{
  char first[MAXNAME];
  char last[MAXNAME];
  char ID[MAXID];
  char *pfirst;
  char *plast;
  char *pID;
  int tage;
  struct STUDENT *temp = (struct STUDENT *) malloc (sizeof(struct STUDENT));

  printf("Enter a first name: ");
  scanf("%s", first);
  pfirst = first;
  printf("entered name: %s\n", pfirst);

  printf("Enter a last name: ");
  scanf("%s", last);
  plast = last;
  printf("entered name: %s\n", plast);

  printf("Enter the Purdue ID: ");
  scanf("%s", ID);
  pID = ID;
  printf("ID: %s\n", pID);

  printf("Enter an age: ");
  scanf("%d", &tage);
  printf("age: %d\n", tage);

  temp->FirstName = strdup(first);
  printf("first\n");
  temp->LastName = strdup(last);
  printf("last\n");
  temp->PUID = strdup(ID);
  printf("id\n");
  temp->age = tage;
  printf("age\n");
  temp->next = NULL;
  printf("next\n");

  if (curr == NULL)
    {
      printf("inside if\n");

      head->next = temp; //-------SEGMENTATION FAULT---------------------

      printf("line 107\n");
      head = curr = temp;
      printf("line 109\n");
    }
  else
    {
      curr = temp;
    }

}

到目前为止我所做的背景: 当我尝试将我的数组分配给我的'temp'节点时,我遇到了分段错误,但是通过使用malloc我解决了这个问题。使用print语句,我已将问题跟踪到指示的行。当我尝试运行代码时,我遇到了分段错误。我在'head'和'curr'节点上尝试了相同的malloc代码,但这给了我:

carlton@carlton-Inspiron-N7010:~/CNIT315$ gcc lab5.c
lab5.c:20:64: error: invalid initializer
struct STUDENT head = (struct STUDENT *) malloc (sizeof(struct STUDENT));

这是我认为问题所在的地方,但我一直在寻找和试验几个小时而且没有得到任何结果。我刚刚意识到这是一个很长的帖子。感谢您阅读,我感谢任何正确方向的推动!

3 个答案:

答案 0 :(得分:0)

我错了还是您设置head->next = temp;但从未将head设置为有效对象? 您必须在开头使用“空”学生初始化head,否则您只需设置head = temp;

答案 1 :(得分:0)

假设您已在head函数之外定义了createListNode()变量,那么问题就出现了:

永远不会为内存分配内存,因为您从未调用malloc()

答案 2 :(得分:0)

您将head初始化为NULL。在为其分配有效指针之前,您无法取消引用headhead->next = temp;为您提供了段错误,因为head是空指针。

因此,您需要查看代码的这一部分:

  if (curr == NULL)
    {
      printf("inside if\n");

      head->next = temp; //-------SEGMENTATION FAULT---------------------

      printf("line 107\n");
      head = curr = temp;
      printf("line 109\n");
    }   else
    {
      curr = temp;
    }

由于您似乎想在列表的末尾插入,我建议这样的内容:

temp->next = NULL;
if (head == NULL) {
  curr = head = temp;
} else {
  curr->next = temp;
  curr = temp;
}

这使curr始终指向最后一个节点,head始终指向列表的开头。