-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 포인터를 가진 구조의 배열을 해제
게으른 아마추어 사용이 나의 마지막 숙제를 위해 일했던 것을 기억하고 있기 때문에 나의 방어에 나는 메인에서 파일 입력을 선언했다. 그들이 말한 것을 알고 있 느냐? "작동한다면, 고치지 마라." 보다 전문적인 접근법을 얻는 것. student_list-> list elemenets를 할당 한 부분을 해방시키기 위해 (적어도 시도했습니다); student_list-> list [i] .name = (char *) malloc (15); student_list-> list [i] .lastname = (char *) malloc (15); 그들은 힙이 이미 할당되지 않았다는 것을 말해 준다. 어쨌든 사라지거나 함수를 할당하지 못했기 때문에 함수 정의에 할당했기 때문에 그 사실을 알 수 있습니까? –
그들은 어쨌든 사라질 것입니다, 당신은이 시점에서 실패했습니다. 당신은 그들을 스택에 더 섬세하게 할당했습니다. 더 잘 이해하려면이 부분을 살펴보십시오. http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – akristmann