微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用双指针将值分配给结构字段? C

如何解决无法使用双指针将值分配给结构字段? C

我可能在这里发了一些非常明显的消息,但是我已经呆了几个小时了,我不知道自己在做什么错。基本上,我有一个类型为student的双指针,称为class_list

student是具有多个字段的结构,例如IDfirst_namelast_name

我需要从文件中读取数据并将此数据放置在每个结构student的相应字段中。

这是我的实现(顺便说一句,文件中的第一个值包含学生人数,因此行fscanf(input_file,"%d",sizePtr);):

student** create_class_list(char *filename,int *sizePtr) {

    printf("FUNCTION CALL **\n\n");

    FILE *input_file = fopen(filename,"r");

    fscanf(input_file,sizePtr);
    int totalStudents = *sizePtr;
    student **class_list = calloc(totalStudents,sizeof(student));

    while (totalStudents) {

        fscanf(input_file,&(*class_list)->student_id);
        fscanf(input_file,"%s",(*class_list)->first_name);
        fscanf(input_file,(*class_list)->last_name);
        class_list++;

        totalStudents--;
    
    }
    fclose(input_file);


    return class_list;
}

我尽力通过其他堆栈文章来寻找答案,this似乎清楚地说明了我的问题。但是,我已经通过首先取消引用双指针(*class_list)->student_id来尝试了他们的解决方案,但是执行代码时仍然遇到问题。

解决方法

至少:分配错误

//                                              This is the size of a structure  
// student **class_list = calloc(totalStudents,sizeof(student));
student **class_list = calloc(totalStudents,sizeof *class_list );
//                                           This is correct,size of a pointer

我建议一种新方法。分配一个student数组,而不是一个指向student的指针数组。

// student** create_class_list(char *filename,int *sizePtr) {
student* create_class_list(char *filename,int *sizePtr) {
  *sizePtr = 0;
  printf("FUNCTION CALL **\n\n");
  FILE *input_file = fopen(filename,"r");
  if (input_file == NULL) return NULL;  // Check return value

  int totalStudents = 0;
  fscanf(input_file,"%d",&totalStudents);
  student *cl = calloc(totalStudents,sizeof *cl);

  if (cl) {
    int i; 
    for (i = 0; i < totalStudents; i++) {
      // Check return value of `fscanf()` (Should also do so above)
      if (fscanf(input_file,"%d%s%s",// Better to use width limits with %s
          &cl[i]->student_id,cl[i]->first_name,cl[i]->last_name) != 3) break;
    }
    *sizePtr = i; // Record how many were read 
  }

  fclose(input_file);
  return cl;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。