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

나는이 코드의 일부를 풀어 내지 못하고 있다고 생각한다. 나는 elemenets를 먼저 풀어 놓고 전체 배열을 배워야한다는 것을 알았지 만 잘못된 방법을 배웠을 것이다. 어쨌든이 코드는 그렇지 않다. 오류 메시지를 표시하지는 않지만 때때로 txt에서 모든 학생 목록을 가져온 후에 충돌합니다.char 포인터를 가진 구조의 배열을 해제

답변

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); 
     } 
} 

그리고 마지막에 당신이 student_list가 힙에 할당되지 않았기 때문에이

free(student_list->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

관련 문제