2017-01-22 14 views
0

ダイナミックアレイ上のメモリを再割り当てするために使用する関数です。私はtypedef'd struct lotterylotを持っています。私は参照構造体の配列(a)とそれを持ってほしい新しいサイズ(n)を渡しています。私はaにreallocすることができるように一時的な配列(b)を宣言しています。これは動作するはずではないと確信していますが、

b = realloc()などでヒープ上にいくつかのバイトを作成していますが、機能を終了する前にfree(b)にすると正しく動作しません。私が再び呼び出すと、b == NULLtrueになりますが、free(b)を削除してもうまく動作しますが、ヒープ上にガベージバイトを残しているため、正しくはないと思います。誰か私に問題を説明してもらえますか?

lot *Enterd(lot **a, int n) { 
    lot *b = NULL; 
    b = (lot *)realloc(*a, n * sizeof(lot)); 
    if (b == NULL) { 
     printf("Memory could not be allocated for the new input.\n"); 
     return NULL; 
    } 
    *a = b; 
    free(b); 
    return *a; 
} 

答えて

1

b = realloc(*a, X)*aに関連付けられたメモリを解放し、bに格納されたサイズXの新しい割り当てを割り当てます。

*a = bを実行すると、*abの両方がこの新しい割り当てを参照します。

free(b)の後、その割り当てが解放され、b*aの両方が無効なポインタになります。その時点でreturn *aには未定義の動作があります。

フリーダイヤルbをお持ちでない場合は、すべて問題ありません。メモリへのポインタがまだ残っているため、メモリがリークすることはありません。呼び出し元の変数を参照する*aと関数の戻り値の両方を使用します。

(また、realloc()をキャストしないでください。)

+0

トム・ザイッチとmelpomene.Whyが、私はそれをキャストするべきではないのですか?ユニでは、我々はreallocのがvoid *を返し、我々はそれをキャストする必要があることを学びました、ありがとうございます。 (?) – Edward

+0

@Edwardいいえ、 'malloc'と' realloc'は 'void *'を返しますので、キャストする必要はありません。 'void *'ポインタは暗黙的に任意のオブジェクトポインタ型に変換できます。一方、鋳造は問題を隠すことができます:http://c-faq.com/malloc/mallocnocast.html – melpomene

+0

私はプロフェッサーに尋ねますが、とにかくフィードバックと助けをくれてありがとう! – Edward

関連する問題