我们都知道的是,在C语言中,我们要使用到堆区空间是,需要用到malloc函数去申请一定大小的堆区空间,在使用完后,同时也需要用到free函数去释放这一片所申请到的堆区空间,并将栈区存储所申请到堆区空间的地址的指针置为空指针。
在申请空间时,malloc函数会返回一个地址,这个地址是指向的所申请到的堆区空间,而申请到的这个地址是存储在栈区的。
当使用子函数进行对申请空间的释放时,若传参为这个地址本身,在子函数中释放所申请空间。再将指针置空后,我们在主函数中打印这个指针的地址,会发现,在子函数实现后其值没发生变化,并没有改变为NULL,这时就会产生一种错觉,即是不是我的子函数出现了错误,或者是这样并没用释放空间,但是当我们在这之后再去操作这片空间,则会没有响应,那么也就是说明,我们所申请的堆区空间确实是已经释放了,得出结论,使用子函数进行空间释放,传参为一级指针时,所申请空间可以释放,但栈区存储申请空间的地址不会置空。
指针没有被置空的原因是,C语言函数实现功能时,会将所传的参数复制一份,重新申请一片空间去进行操作,在函数执行完毕后向主函数返回返回值,再将函数申请到的操作空间自动释放, 所以上述的当传参为一级指针是,函数中置空的指针只是它的一个复制品,因此要想在子函数中将这个指针置空,则需要传参为二级指针,即要想在子函数中改变主函数中的值,就要传参这个值的地址才可以。
传参为一级指针时
int freelist(list *plist)
{
if(NULL == plist)
{
return PLISTNULL;
}
free(plist);
plist=NULL;
return OK;
}

传参为二级指针时
int freelist(list **plist)
{
if(NULL == *plist)
{
return PLISTNULL;
}
free(*plist);
*plist=NULL;
return OK;
}

本文探讨了C语言中如何使用malloc和free函数管理堆空间。详细分析了一级指针与二级指针传递的区别,以及如何正确地释放内存并避免内存泄漏。

被折叠的 条评论
为什么被折叠?



