2016-04-17 12 views
-4

私は人の特性とGPAを構造体に保存し、それらの特性をすべて再現するプログラムを作成しています。入力されたグレード/ GPAは浮動小数点型のポインタです。私はメモリ空間を解放するfree_mem関数に問題があります。 Student_tは私の構造体データ型の名前で、* stuは学生レコードの配列の最初の生徒へのポインタであり、int生徒は総学生数の入力値です。私のエラーメッセージが読み:構造体とメモリをクリアするフリー関数:Cプログラミング

error: request for member 'list_grades' in something not a structure or union 
error: request for member 'list_grades' in something not a structure or union 
error: request for member 'grades_list' in something not a structure or union 
error: request for member 'grades_list' in something not a structure or union 

構造体のMy機能が... ...

void free_mem(student_t *stu, int students){ 
    int i; 
    for(i=0;i<students;i++){ 
     free(stu.list_grades); 
     stu.list_grades=NULL; } 
    free(stu.grades_list); 
    stu.grades_list=NULL; 
} 

EDITメモリをされて解放する

typedef struct{ 
    int sid; 
    char last_name[NAME_SIZE]; 
    char first_name[NAME_SIZE]; 
    float *list_grades; 
    float gpa; 
} student_t; 

My機能である:操作さ私の自由をstu.list_gradesからstu-> list_grades、grades_listからgpaへの関数ですが、2番目の部分ではまだ混乱しています。 void型から互換性のないタイプのタイプを割り当てる「フロート」

マイ:

エラー:「無料」ノートの引数1のための互換性のない型:予想「無効*」が、引数は型である「フロート」 エラーメモリを解放するための機能が...あなたはstudent_tを初期化する部分を示しやりなさい

void free_mem(student_t *stu, int students){ 
    int i; 
    for(i=0;i<students;i++){ 
     free(stu->list_grades); 
     stu->list_grades=NULL; } 
    free(stu->gpa); 
    stu->gpa=NULL; 
} 
+2

'stu.list_grades' - >' stu-> list_grades' – BLUEPIXY

+0

構造体ポインタではなく構造体ポインタを使用しているため、逆参照する必要があります。 '(* stu).list_grades'を使うことができますが、この構文はやや面倒なので、Cは' stu-> list_grades'と同じ略式を提供します。 –

+0

これは意味をなさない: 'free(stu-> gpa)'。あなたは 'フロート'を 'フリー'に渡しています。 'free(123.456) 'と変わりはありません。意味がない、そう? 'free'に*ポインタ*を渡す必要があります。これは' malloc'や 'realloc'などで返されたものです。あなたはそれを選択的に解放することはできません。あなたは全体を解放するか、何もしないでください。 –

答えて

0

です。 free()は、ポインタを動的に割り当てた場合にのみ使用します。つまり、malloc()calloc()またはrealloc()をポインタに使用したことを意味します。そうでなければ、あなたはそれを解放すべきではありません。

void free_mem(student_t *stu, int students) 
{ 
    int i; 
    for(i=0;i<students;i++) 
    { 
     free(stu.list_grades); 
     stu->list_grades = NULL; //stu is a pointer, so you need `->` 

     // You said stu was a pointer to the first student. 
     // You want to iterate over them, so you want to point to 
     // the next element of the array containing all the students 
     stu++; 
    } 

    // gpa is not a pointer, so you don't want to free it! 
    // You only want to free pointer, which have been allocated using `malloc()` 
    // free(stu->gpa); 
    // stu->gpa = NULL; 
} 
1

あなたがループのためにあなたのfree()内部を使用しようとすると問題が発生しています。

free()ポインタ上で使用する必要がありますが、あなたのforループでは、あなたは(特にlist_gradesメンバー、)構造の内側から特定のメンバーにそれを使用しようとしています。

溶液は、おそらくそうように、(あなたは、構造体の配列として配列を作成したと仮定すると、あなたは、関数に渡された配列の各指標である、)各ポインタにfree()を呼び出すことである。

void free_mem(student_t *stu[], int students){ 
    int i; 
    for(i = 0; i < students; i++) 
    { 
     free(stu[i]); 
    } 
} 
関連する問題