2

だから私はCに慣れていないので、コツをつかむのに役立つ簡単なプログラムをいくつか作成しています。

次のような構造体があるとしましょう。

typedef struct {
   char* field;
} something;

そして、次のように、これらのうちの 10 個のスペースを動的に割り当てます。

something* stuff = calloc(10, sizeof(something));

次に、これらの何かの1つを削除したいとしましょう。それは理にかなっていますか:

free(&stuff[4]);

それとも、何かの連続したブロックではなく、何かへのこれらすべてのポインターを作成した場合にのみ意味がありますか?

私がそれをしてうまくいった場合、次のようになります:

stuff[4] = malloc(sizeof(something))

次に、そのインデックスに「何か」を再度追加する必要があるだけですか?

それとも、一般的に、構造体自体ではなく、構造体へのポインターを含むメモリのブロックとして、そのような構造体を扱うのでしょうか?

ありがとう。

4

2 に答える 2

8

ルールはとても簡単です。割り当てたものを正確に解放することができ、解放する必要があります。つまり、 / / etc.*free()の戻り値として受け取ったポインター、または null ポインターのみを渡す必要があります。には他に何も渡されません。malloccallocreallocfree()

したがって、配列全体を解放することも、まったく解放することもできません。

(また、「中間から単一の要素を解放する」ことはまったく無意味であることにも注意してください。そのような「神聖な」配列を賢明に反復処理する方法がないためです。)メモリの割り当てを解除したい場合は、新しい範囲を割り当て、必要な要素を上書きして、元の配列を解放します。

*) 一部の準標準関数は、解放する必要がある動的に割り当てられたメモリを間接的に返す場合があります。ドキュメントを確認してください。いくつかの例はstrdup、GNU のscanf、および GCC のabi::__cxa_demangleです。)

于 2013-07-01T23:43:42.130 に答える
5

マニュアルページによると

free() 関数は、ptr が指すメモリー空間を解放します。このメモリー空間は、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたものでなければなりません。それ以外の場合、または free(ptr) が以前に呼び出された場合、未定義の動作が発生します。

データのブロック全体のみを解放できます。したがって、他のものを解放しようとしないでください。

于 2013-07-01T23:44:31.633 に答える