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



我正在努力完成编程作业,需要帮助处理链表。基本上,我们必须创建一个包含某些功能的程序来管理链表。相当标准。我上周试过了,但就是没能成功。这个周末我正努力让它发挥作用,一直在取得良好的进展,直到遇到分割错误。

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: %sn", pfirst);
  printf("Enter a last name: ");
  scanf("%s", last);
  plast = last;
  printf("entered name: %sn", plast);
  printf("Enter the Purdue ID: ");
  scanf("%s", ID);
  pID = ID;
  printf("ID: %sn", pID);
  printf("Enter an age: ");
  scanf("%d", &tage);
  printf("age: %dn", tage);
  temp->FirstName = strdup(first);
  printf("firstn");
  temp->LastName = strdup(last);
  printf("lastn");
  temp->PUID = strdup(ID);
  printf("idn");
  temp->age = tage;
  printf("agen");
  temp->next = NULL;
  printf("nextn");
  if (curr == NULL)
    {
      printf("inside ifn");
      head->next = temp; //-------SEGMENTATION FAULT---------------------
      printf("line 107n");
      head = curr = temp;
      printf("line 109n");
    }
  else
    {
      curr = temp;
    }
}

到目前为止我所做的工作的背景:当我试图将数组分配给"temp"节点时,遇到了分段错误,但通过在上面使用malloc,我解决了这个问题。使用打印语句,我已将问题跟踪到指示行。当我尝试运行代码时,我会遇到分段错误。我在"head"one_answers"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));

这就是我认为问题所在的地方,但我已经搜索和试验了几个小时,但没有取得任何进展。我刚刚意识到这是一个很长的帖子。谢谢你通读,我很感激你朝着正确的方向努力!

head初始化为NULL。在为head分配有效指针之前,不能取消引用它。head->next = temp;会给你一个segfault,因为head是一个空指针。

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

  if (curr == NULL)
    {
      printf("inside ifn");
      head->next = temp; //-------SEGMENTATION FAULT---------------------
      printf("line 107n");
      head = curr = temp;
      printf("line 109n");
    }   else
    {
      curr = temp;
    }

既然你似乎想在列表的末尾插入,我建议这样做:

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

这使得curr总是指向最后一个节点,而head总是指向列表的开头。

我错了吗?还是您设置了head->next = temp;,但以前从未将head设置为有效对象?您必须在开始时使用"空"Student初始化head,或者只需设置head = temp;

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

内存从未分配给它,因为您从未调用过malloc()

相关内容

  • 没有找到相关文章

最新更新