освободить указатель на динамический массив в c - PullRequest
3 голосов
/ 18 марта 2011

Я создаю динамический массив в c с помощью malloc.например:

myCharArray = (char *) malloc(16);

теперь, если я создам функцию, подобную этой, и передам ей myCharArray:

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

сработает или я каким-то образом только освободлю копию указателя (myCharArrayp), а не собственно myCharArray?

Ответы [ 3 ]

14 голосов
/ 18 марта 2011

Вы должны понимать, что указатель - это только переменная, которая хранится в стеке. Он указывает на область памяти, в данном случае выделенную в куче. Ваш код правильно освобождает память в куче. Когда вы возвращаетесь из своей функции, переменная-указатель, как и любая другая переменная (например, 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.
7 голосов
/ 18 марта 2011

Это будет хорошо и освободит память, как вы ожидаете.

Я бы подумал написать такую ​​функцию, как

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

, чтобы после освобождения указатель устанавливался в NULLПовторное использование ранее освобожденных указателей является распространенным источником ошибок.

1 голос
/ 18 марта 2011

Да, это будет работать.

Хотя копия переменной-указателя будет отправлена, но она все равно будет указывать на правильную ячейку памяти, которая действительно будет освобождена при вызове free.

...