1

次の状況を想定します。

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

配列を動的に作成します。この構造は次のとおりです。

Reg *myReg = (Reg*) malloc(sizeof(Reg)*100); //array of type Reg with 100 positions.

そして、このサンプル システム全体で、この配列を埋めます。

ポインター「myReg」がこのベクトルを指したくないという特定のポイントがあります。彼に NULL を指してもらいたい。また、malloc が占有するメモリ領域をクリアするためにも実行しました。

質問:

私が行った場合:

free(myReg);

これにより、myReg は NULL を指し、割り当てたスペースを解放しますか?

4

3 に答える 3

5
free(myReg);

これにより、myReg は NULL を指し、割り当てたスペースを解放しますか?

メモリを解放するだけです。仕様を読まなくても、関数がどのように宣言されているかを見ると、ポインターが指すものを実際に変更できないfreeことがわかります。

/* Even if it wanted, `free` can't make `ptr` point to anything else. */
void free(void *ptr);
于 2012-05-22T05:54:39.510 に答える
3

freeの呼び出しは、割り当てられたメモリのみを解放し、それをヒープに返します。myReg を NULL に設定しません。あなたはそれを自分でしなければなりません。

1 つの方法は、次のようにマクロを記述することです。

#define MY_FREE(ptr) free(ptr); ptr = NULL;
于 2012-05-22T05:57:43.967 に答える
2

他の答えは正しいです。

なぜそうしなければならないのかを理解するのを助けるために、このメモリ、またはその異なる部分を指している複数のポインタがあるかもしれないと考えてください:

Reg *myReg = (Reg*) malloc(sizeof(Reg)*100);
Reg *myReg2 = myReg;
Reg *myReg3 = &myReg[50];

を解放するmyRegと、これらのポインタはすべて変更されません。それらは以前と同じメモリを指していますが、このメモリはもはや使用されてはなりません。
プログラマーは、それらを NULL に設定する必要があります (または解放された後は使用しないでください)。
C はそれらをすべて見つけることができず、それらを NULL に設定します。Java などの最新の言語は、特定のオブジェクトへのすべてのポインターを追跡する方法を知っていますが、C はこのようなことはしません。

于 2012-05-22T06:23:21.347 に答える