5

Cでmallocを使用して動的配列を作成します。つまり、次のようになります。

myCharArray = (char *) malloc(16);

このような関数を作成して渡すと、次のようmyCharArrayになります。

reset(char * myCharArrayp)
{
    free(myCharArrayp);
}

myCharArraypそれは機能しますか、それとも実際のポインターではなく、ポインターのコピーのみを解放しますmyCharArrayか?

4

3 に答える 3

14

ポインターは、スタックに格納される単なる変数であることを理解する必要があります。この場合、ヒープに割り当てられたメモリ領域を指します。コードは、ヒープ上のメモリを正しく解放します。関数から戻ると、ポインター変数は他の変数 (例えば an int) と同様に解放されます。

void myFunction()
{
    char *myPointer;     // <- the function's stack frame is set up with space for...
    int myOtherVariable; // <- ... these two variables

    myPointer = malloc(123); // <- some memory is allocated on the heap and your pointer points to it

    free(myPointer); // <- the memory on the heap is deallocated

} // <- the two local variables myPointer and myOtherVariable are freed as the function returns.
于 2011-03-18T09:55:06.373 に答える
9

それは問題なく、期待どおりにメモリを解放します。

このように関数を書くことを検討します:

 void reset(char** myPointer) {
     if (myPointer) {
         free(*myPointer);
         *myPointer = NULL;
     }
 }

解放された後、ポインターが NULL に設定されるようにします。以前に解放されたポインターの再利用は、エラーの一般的な原因です。

于 2011-03-18T09:54:29.067 に答える
1

はい、動作します。

ポインター変数のコピーが送信されますが、free を呼び出すときに実際に解放される正しいメモリ位置を参照します。

于 2011-03-18T09:55:20.653 に答える