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

このコードの一部を解放できなかったと思います。最初に要素を解放してから配列全体を解放する必要があることを学びましたが、間違った方法を学んだ可能性があります。とにかく、このコードはエラーメッセージを表示せず、すべての学生リストを取得した後にクラッシュすることがあります。 TXT。

4

1 に答える 1

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 がヒープに割り当てられていないためです。

于 2013-03-20T15:40:13.930 に答える