C 函数传递指针参数注意事项
void mem_free(void *ptr)
{
if(NULL != ptr)
{
free(ptr);
ptr = NULL;
}
}
不仔細看沒發現問題吧,把ptr的指針free掉,然后NULL操作,但是問題來了,當我為char *buff 執行mem_free(buff)函數后,發現第二次運行mem_free(buff)發現NULL != ptr竟然為true,郁悶了吧?這個問題搞了我半天時間,后來查看相關書籍才發現,當第一次mem_free的時候,free確實把內存給清除了,但是壞就壞在ptr = NULL;上,注意這個時候ptr只是一個指向buff指針的副本,也就是這個時候運行時態的指針可以理解成這樣 ptr->buff->heap,free是因為沒有改變ptr的指向,只是free掉了值,所以heap中的值被清除了,但是ptr = NULL,其實是切斷了ptr –> buff的這根鏈,那么,buff ->heap這個鏈沒有斷開,所以其實buff還是指向這heap這個內存,雖然heap中已經不存在任何有用的數據了。但是我們的本意是要斷開 buff –> heap這個鏈,所以這個函數應該寫成傳遞二級指針:
void mem_free(void **ptr)
{
if(NULL != *ptr)
{
free(*ptr);
*ptr = NULL;
}
}
這個問題可以總結為:改變指針指向的內容不需要傳遞指針地址,改變指針的指向,一定要傳遞指針的地址。
總結
以上是生活随笔為你收集整理的C 函数传递指针参数注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写一个《扎金花》程序自己玩。
- 下一篇: 如何简化临时内存的分配与释放