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