#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int id;
char *name;
char *lastname;
} student_type;
typedef struct
{
student_type list[15];
} student_list_type;
void get_students(FILE *input,char *filename,student_list_type *student_list);
int main()
{
printf("Hello world!\n");
student_list_type std_list;
student_list_type *std_list_p=&std_list;
FILE *input;
get_students(input,"students.txt",std_list_p);
return 0;
}
void get_students(FILE *input,char *filename,student_list_type *student_list)
{
int i=0;
int j=0;
input=fopen(filename,"r");
printf("filename is %s",filename);
while(fscanf(input,"%d",&student_list->list[i].id)==1)
{
student_list->list[i].name=(char *) malloc(15);
student_list->list[i].lastname=(char *) malloc(15);
fscanf(input,"%s",student_list->list[i].name);
fscanf(input,"%s",student_list->list[i].lastname);
i++;
}
for(j=0; j<i+1; j++)
{
free(student_list->list[i].name);
free(student_list->list[i].lastname);
}
free(student_list->list);
fclose(input);
}
我认为我没有释放部分代码。我已经知道我应该首先释放elemenets然后整个数组但我可能学会了错误的方法。不管怎么说这段代码不会给出错误消息但是有时候在获取所有代码之后崩溃来自txt的学生名单。
答案 0 :(得分:0)
首先,你不检查你的fopen是否成功,如果失败,fscanf仍会尝试打开变量输入,但在这种情况下会为NULL。
为什么要声明“File * input;”在主?如果你在下一刻将它传递给你的函数“get_student”。为什么不直接在函数中声明呢?
此代码更安全无法使用
void get_students(char *filename,student_list_type *student_list)
{
int i=0;
int j=0;
FILE * input;
input=fopen(filename,"r");
printf("filename is %s",filename);
if((input = fopen("students.txt","r")) == NULL)
{
fprintf(stderr, "\nFile could not be open\n");
}
else
{
while(fscanf(input,"%d",&student_list->list[i].id)==1)
{
student_list->list[i].name=(char *) malloc(15);
student_list->list[i].lastname=(char *) malloc(15);
fscanf(input,"%s",student_list->list[i].name);
fscanf(input,"%s",student_list->list[i].lastname);
i++;
}
for(j=0; j<i+1; j++)
{
free(student_list->list[i].name);
free(student_list->list[i].lastname);
}
fclose(input);
}
}
最后你不需要释放这个
free(student_list->list);
因为没有在堆上分配student_list。