2016-04-17 3 views
-4

Я создаю программу, которая будет сохранять черты лица и их классов/GPA в структуру, а затем перепечатывать все эти черты. Введенные классы/GPA являются указателями типа float. У меня возникла проблема с моей функцией free_mem, которая освободит пространство памяти. Student_t - это имя моего типа данных структуры, а * stu - указатель на первый ученик в массиве записей учащихся, а int students - входные значения общего числа студентов. Мое сообщение об ошибке гласит:Структуры и свободная функция для очистки памяти: 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 

Моя функция для структуры является ...

typedef struct{ 
    int sid; 
    char last_name[NAME_SIZE]; 
    char first_name[NAME_SIZE]; 
    float *list_grades; 
    float gpa; 
} 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.grades_list); 
    stu.grades_list=NULL; 
} 

EDIT: Манипулирование мой свободный от stu.list_grades до stu-> list_grades и grades_list до gpa, но все еще запутался во второй части.

ошибка: несовместимый тип для аргумента 1 «свободной» Примечание: ожидаемый «недействительным *», но аргумент типа «поплавка» ошибка: несовместимые типы при назначении типа «поплавок» от типа пустот

Мои функция для освобождения памяти является ...

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)'. Вы передаете 'float'' free'. Это ничем не отличается от 'free (123.456)'. Бессмысленно, правда? Вам нужно передать * указатель * на 'free', который был возвращен' malloc' или 'realloc' и т. Д. Вы не можете выборочно освободить его. Вы либо бесплатно освобождаете все, либо ничего. –

ответ

0

вы havn't показали ту часть, где вы инициализации student_t. Помните, что вы хотите использовать указатель 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() внутри вашего цикла for.

free() должен быть использован на указатель, но в вашей цикл вы пытаетесь использовать его на конкретных пользователей внутри структуры (list_grades членов, в частности).

Решения назвать free() по каждому указателю (который, если вы создали массив как массив структур, является каждый индекса массива, который вы передали в функцию), возможно, например, так:

void free_mem(student_t *stu[], int students){ 
    int i; 
    for(i = 0; i < students; i++) 
    { 
     free(stu[i]); 
    } 
} 
Смежные вопросы