指針被釋放后,是不是就變成了空指針?有好多同學提出了這樣的問題。
借用《C專家編程》上面的一段代碼,可以很好的解釋這個問題。
#includeint main() { char *s = (char *)malloc(128); strcpy(s, "helloworld"); free(s); if (s != NULL) strcpy(s, "12345"); return 0; }
這段代碼大家看下有沒有問題,能不能順利運行?
前面三行都沒有問題,指針 s 指向了一塊堆內存,把字符串 helloworld 拷貝到堆內存中,然后釋放了 s。
問題就出在這,很多同學不理解,指針 s 被釋放了,是不是就變成了空指針?
如果變成了空指針,那下面的判斷就不會成立,也就不會執行拷貝操作。
其實這樣的理解是有問題的。
指針 s 指向了堆內存,free(s) 準確的講,是把 s 指向的內存釋放掉,這個操作對 s 本身并沒有影響,s 里面保存的還是原來那塊內存的地址,并不是空。
所以下面的判斷語句成立,繼續執行拷貝操作。
由于 s 指向的內存已經被釋放掉,強行往里面拷貝,就會出現意想不到的錯誤。
養成良好的編程習慣就是指針被釋放掉后,手動把它變成空,空指針比野指針、懸空指針更可控。
指針是C語言的精髓,如果你還是覺得模棱兩可,不妨看下這套播放量近 20 萬的指針教程,課程以及資料全部開源,看完后一定會讓你的指針水平達到一個更高的級別。
-
指針
+關注
關注
1文章
481瀏覽量
70601 -
代碼
+關注
關注
30文章
4823瀏覽量
68985
原文標題:指針被釋放后,是不是變成了空指針
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論