2016-04-17 10 views
-4

Ich erstelle ein Programm, das Eigenschaften einer Person und ihre Grade/GPA in einer Struktur speichert, und dann alle diese Merkmale neu drucken. Die eingegebenen Grade/GPA sind Zeiger des Gleitkommatyps. Ich habe Probleme mit meiner free_mem-Funktion, die den Speicherplatz freigibt. Student_t ist der Name meines Strukturdatentyps und * stu ist ein Zeiger auf den ersten Schüler in einem Array von Schülerakten, und int Schüler ist ein Eingabewert der Gesamtzahl der Schüler. Meine Fehlermeldung lautet:Strukturen und freie Funktion, um Speicher zu löschen: C Programmierung

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 

Meine Funktion für die Struktur ist ...

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

Meine Funktion für die Freigabe der Speicher ...

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: Manipulierte meine freie Funktion von stu.list_grades zu stu-> list_grades und grains_list zu gpa, aber immer noch verwirrt im zweiten Teil.

Fehler: inkompatible Typ für Argument 1 von ‚freien‘ note: erwartet ‚void *‘ aber Argument ist vom Typ ‚float‘ Fehler: inkompatible Typen bei der Zuordnung des Typs ‚schweben‘ von Typ void

Mein Funktion für die Speicherfreigabe ist ...

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

Sie verwenden einen Strukturzeiger, keine Struktur, daher müssen Sie ihn dereferenzieren. Sie können '(* stu) .list_grades' verwenden, aber diese Syntax ist ein wenig umständlich, daher stellt C eine äquivalente Kurzschrift zur Verfügung, die' stu-> list_grades 'ist. –

+0

Das ergibt keinen Sinn: 'free (stu-> gpa)'. Du gibst einen 'float' nach' free'. Es ist nicht anders als 'free (123.456)'. Bedeutungslos, oder? Sie müssen einen * Zeiger * an "frei" übergeben, einen, der von 'malloc' oder' realloc' zurückgegeben wurde. Sie können ein Teil davon nicht selektiv freigeben. Entweder Sie befreien das Ganze oder gar nichts. –

Antwort

0

Sie havn't den Teil gezeigt, wo Sie student_t initialisieren. Denken Sie daran, dass Sie nur einen Zeiger verwenden möchten, wenn Sie ihn free() dynamisch zugewiesen haben, was bedeutet, dass Sie malloc(), calloc() oder auf dem Zeiger verwendet haben. Andernfalls sollten Sie es nicht freigeben.

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

Das Problem auftritt, wenn Sie versuchen, für Schleife free() innerhalb Ihres zu verwenden.

free() hat auf einem Zeiger verwendet werden, aber in Ihrem for-Schleife Sie versuchen, es aus dem Inneren der Struktur auf Mitgliedern zu verwenden (das list_grades Mitglied, speziell).

Die Lösung ist free() auf jedem Zeiger zu nennen (die, vorausgesetzt, Sie das Array als eine Anordnung von Strukturen geschaffen ist jeder Index des Arrays, die man in die Funktion übergeben), vielleicht etwa so:

void free_mem(student_t *stu[], int students){ 
    int i; 
    for(i = 0; i < students; i++) 
    { 
     free(stu[i]); 
    } 
}