在c中释放指向动态数组的指针

时间:2011-03-18 09:52:52

标签: c pointers free dynamic-arrays

我使用malloc在c中创建一个动态数组。 e.g:

myCharArray = (char *) malloc(16);

现在如果我创建一个这样的函数并将myCharArray传递给它:

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

会工作,还是我会以某种方式只释放指针的副本(myCharArrayp)而不是实际的myCharArray?

3 个答案:

答案 0 :(得分:14)

您需要了解指针只是一个存储在堆栈中的变量。它指向一个内存区域,在这种情况下,在堆上分配。您的代码正确释放了堆上的内存。当您从函数返回时,指针变量就像任何其他变量(例如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.

答案 1 :(得分:7)

这样会很好,并且可以像你期望的那样释放记忆。

我会考虑编写像

这样的函数
 void reset(char** myPointer) {
     if (myPointer) {
         free(*myPointer);
         *myPointer = NULL;
     }
 }

这样在释放后指针被设置为NULL。重用以前释放的指针是常见的错误来源。

答案 2 :(得分:1)

是的,它会起作用。

虽然会发送一个指针变量的副本,但它仍然会引用正确的内存位置,这个位置在调用free时确实会被释放。