2016-09-30 15 views
-2

割り当ては、10個の要素が「students」であり、それぞれがスコアとIDを持つ構造体配列を作成することです。コード内で変更が許可されていないものがいくつかあります(メインのものと同様)。構造体配列からの空きメモリ

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

だから、これは罰金コンパイルしたコードの残りの部分は正常に実行されますが、それは自由になったとき、その後コアダンプ()。また、これは私の教授が私に与えた主なものであり、変更しないように教えてくれました。デアロケート関数を呼び出す必要はありませんでしたので、メインが終了したときに自動的に呼び出されるのか、間違ってそれを残したのか不思議です。私はそれが合理的だと思うので、私はそれを追加しました。

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()'が1つあるはずです。 ( 'realloc()'を使うと、計数作業にスパナを投げることができます - 空きメモリを割り当て、再割り当てできますが、コンセプトは適用されます) –

答えて

4

あなた1つのmallocコール(これは正しい)とメモリの1つの連続ブロックとして(m)allocated 10-学生の配列。

これを解放するには、freeを最初の配列要素に1回だけ使用します。これにより、10人の学生アレイ全体である連続したメモリブロック全体が解放されます。

1

私は同じクラスにいると思います。私はこの同じプログラムをやっています。これは私の割り当て解除機能をどのようにして、メモリリークやダンプもありません。

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

ありがとう!メインの関数への呼び出しを追加する必要がありましたか? –

+0

@AHAZY。笑遅く返事を申し訳ありません:/ – izzzi

関連する問題