2016-09-30 4 views
-2

Назначение - создать массив структур с 10 элементами в качестве «учеников», каждый из которых имеет оценку и идентификатор. Есть некоторые вещи, которые мне не разрешают изменять в коде (например, что-либо в основном).C свободная память из массива struct

#include <stdio.h> 
#include <stdlib.h> 

struct student* allocate(){ 
    struct student* array = malloc(10 * sizeof(struct student)); 
    return array; 
} 

void deallocate(struct student* stud){ 
    int i = 0; 
    for(;i<10;i++) 
     free(&stud[i]); 
} 

Так это нормально компилируется и остальная часть кода работает нормально, но затем дампы, когда он попадает в свободный(). Кроме того, это главное, что дал мне мой профессор и сказал, чтобы я не изменился. Не было никакого вызова функции deallocate, так что теперь мне интересно, будет ли она автоматически вызвана, когда основной будет сделан, или если он оставит ее по ошибке. Я добавил его, потому что думаю, что это кажется разумным.

int main(){ 
    struct student* stud = allocate(); 
    generate(stud); 
    output(stud); 
    sort(stud); 
    for(int i=0;i<10;i++){ 
    printf("%d %d\n", stud[i].id,stud[i].score); 
    } 
    printf("Avg: %f \n", avg(stud)); 
    printf("Min: %d \n", min(stud)); 
    deallocate(stud);  
    return 0; 
} 
+0

Я использую gcc. –

+0

Каков ваш вопрос? – Hypino

+0

Сколько звонков на 'malloc()' есть? Сколько звонков на 'free()'? Почему число разное? Как вы можете перестать быть другим? Для каждого вызова 'malloc()' должен быть один 'free()'. (Если вы используете 'realloc()', он может бросить гаечный ключ в подсчете - он может выделять, перераспределять _or_ свободную память, но концепция применяется.) –

ответ

4

Вы (m)allocated 10-студентов массив как 1 непрерывный блок памяти с 1 malloc вызова (это правильно).

Для этого вы используете только free один раз на первом элементе массива. Это освобождает весь непрерывный блок памяти, который является целым массивом из 10 учеников.

1

Эй, ха-ха, я думаю, были в одном классе. Я делаю эту же программу. Вот как я сделал свою функцию освобождения от несанкционированного доступа, и нет утечек памяти или отвалов:

void deallocate(struct student* stud){ 
    free(stud); 
} 
+0

Спасибо! Вам нужно было добавить вызов функции в основном? –

+0

@AHazy Yep. lol извините за поздний ответ: / – izzzi

Смежные вопросы