2013-03-20 4 views
-1
#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); 
} 

Я думаю, что я не могу освободить часть этого кода. Я узнал, что я должен освобождать элементы сначала, а затем весь массив, но я, возможно, узнал неправильный путь. 't давать сообщения об ошибках, но просто падает после получения всего списка учеников из txt.Освобождение массива структур, у которых есть указатели на символы

ответ

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 не выделяется в куче.

+0

В свою защиту я объявил ввод файла в основном, так как я помню, что использование ленивого любителя работало для моей последней домашней работы. Вы знаете, что они говорят «Если это работает, не исправляйте это». Хотя я был бы осторожен чтобы получить более профессиональный подход. Для освобождения части я выделил (по крайней мере, я попробовал) student_list-> list elemenets; student_list-> list [i] .name = (char *) malloc (15); student_list-> list [i] .lastname = (char *) malloc (15); вы говорите мне, что они уже не выделены в кучу. Вы рассказываете об этом, потому что я назначил определение функции, так как они все равно уйдут или я не смог их вообще выделить? –

+0

Они все равно уйдут, вы не потерпите неудачу в этот момент. Вы выделили их в стек. Взгляните на это, чтобы понять это лучше. http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – akristmann

Смежные вопросы