我在C语言中使用malloc创建了一个动态数组,例如:
myCharArray = (char *) malloc(16);
现在,如果我创建一个这样的函数并将
myCharArray
传递给它:reset(char * myCharArrayp)
{
free(myCharArrayp);
}
这样做行吗?还是我只会释放指向 myCharArrayp
的指针副本,而不是实际的 myCharArray
?
我在C语言中使用malloc创建了一个动态数组,例如:
myCharArray = (char *) malloc(16);
myCharArray
传递给它:reset(char * myCharArrayp)
{
free(myCharArrayp);
}
这样做行吗?还是我只会释放指向 myCharArrayp
的指针副本,而不是实际的 myCharArray
?
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.
这样做可以达到你的预期并释放内存。
我会考虑这样编写函数:
void reset(char** myPointer) {
if (myPointer) {
free(*myPointer);
*myPointer = NULL;
}
}
释放指针后将其设置为NULL,这样可以避免重复使用已释放的指针,因为这是常见的错误源。
char **
(或 void **
),但为什么不在代码中调用 free
后将指针赋值为 NULL
呢?引用一下:“如果 ptr 是 NULL 指针,则不执行任何操作。”所以我会说这个函数有点浪费! - Joe是的,它会起作用。
尽管指针变量的副本将被发送,但它仍将引用正确的内存位置,当调用free时确实会释放该位置。