【问题标题】:This piece of code is giving segmentation fault [closed]这段代码给出了分段错误[关闭]
【发布时间】:2020-06-17 14:29:59
【问题描述】:

为什么这段代码在printf("9\n") 之后出现分段错误。基本上,只要 while 循环开始,代码就会崩溃。谁能告诉我如何解决它?考虑我调用了headrvLoader()inmain()```

tetypedef struct cartbook
{
  int issue;
  char *id;
  struct cartbook *next;
}cartstruct;

struct cartbook *headrv;

void headrvLoader()
{
  FILE *fp1,*fp2;printf("1\n");
  struct cartbook *current,*prev,*p;printf("2\n");
  fp1=fopen("ReservedBooks.txt","r");printf("3\n");
  fp2=fopen("ReservedUserId.txt","r");printf("4\n");
  headrv=(struct cartbook*)malloc(sizeof(struct cartbook));printf("5\n");
  char *str;printf("6\n");
  current=(struct cartbook*)malloc(sizeof(struct cartbook));printf("7\n");
  headrv->next=current;printf("8\n");
  prev=headrv;printf("9\n");
  while(true)
  {
    if(fgets(current->id,50,fp2)==NULL)
    {
        printf("jhhj");
      current=NULL;
      prev->next=NULL;
    }
}
}

【问题讨论】:

  • @PaulOgilvie 成功了! aleast 为 printf("jhhj") 但之后再次出现分段错误
  • 打印“jhhj”后,将 current 设置为 NULL,然后尝试取消引用 NULL 指针 (current->id)。这将导致段错误。
  • 你还需要检查fopen是否成功。如果要打开的文件不存在,你认为会发生什么?
  • @Jabberwocky 我确实检查了它并没有在此处添加它,因为这不是问题
  • 您将 current 设置为 NULL,然后再次循环。因此在 if 语句中,fgets 的 current->id 参数将导致分段错误,因为您尝试取消引用您自己设置为 NULL 的指针。

标签: c gcc linked-list file-handling


【解决方案1】:

fgets(current->id,.. id 中没有初始化。

改为使用例如:

current= malloc(sizeof(struct cartbook));
current->id= malloc(50);  // allocate memory
headrv->next=current;
prev=headrv;
while(true)
{
  if(fgets(current->id,50,fp2)!=NULL)
  {
     printf("%s\n", current->id);
     // whatever....
  }
}

【讨论】:

  • 或者将id从指针char *id改成struct cartbook中长度为50的数组char id[50]
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多