2013-03-20 23 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); 
} 

我覺得我在這個code.I的釋放一部分未能瞭解到,我應該釋放elemenets第一則整個數組但是這個代碼沒有按我可能錯了解到way.Anyways給出錯誤信息,但是在從txt獲取所有學生列表後,有時會崩潰。所有的解放出來的結構數組,它擁有字符指針

回答

0

首先,你不檢查,如果你的fopen成功,如果失敗的fscanf仍然試圖打開變量輸入,但在這種情況下,這將是NULL。

你們爲什麼聲明「文件*輸入;」主要?如果你在下一刻將它傳遞給你的函數「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->列表elemenets通過部分; student_list-> list [i] .name =(char *)malloc(15); student_list->列表[I] .lastname =(字符*)malloc的(15); 你告訴我already.Do你告訴它,因爲我在函數定義分配的,因爲他們將反正走了,他們不是在堆中分配或我辜負了他們在所有分配? – 2013-03-20 17:18:33

+0

無論如何他們將會消失,此時你並沒有失敗。你將它們分配給堆棧。看看這個更好地理解它。 http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – akristmann 2013-03-21 07:36:04