野指針指向一個(gè)已刪除的對象或未申請?jiān)L問受限內(nèi)存區(qū)域的指針。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、寧鄉(xiāng)ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的寧鄉(xiāng)網(wǎng)站制作公司
與空指針不同,野指針無法通過簡單地判斷是否為?NULL避免,而只能通過養(yǎng)成良好的編程習(xí)慣來盡力減少。對野指針進(jìn)行操作很容易造成程序錯(cuò)誤。需對指針進(jìn)行初始化。野指針主要是因?yàn)檫@些疏忽而出現(xiàn)的刪除或申請?jiān)L問受限內(nèi)存區(qū)域的指針。
擴(kuò)展資料
指針變量未初始化
任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的,它會(huì)亂指一氣。所以,指針變量在創(chuàng)建的同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為NULL,要么讓它指向合法的內(nèi)存。如果沒有初始化,編譯器會(huì)報(bào)錯(cuò)“ ‘point’ may be uninitializedin the function ”。
指針釋放后之后未置空
有時(shí)指針在free或delete后未賦值 NULL,便會(huì)使人以為是合法的。別看free和delete的名字(尤其是delete),它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒有把指針本身干掉。此時(shí)指針指向的就是“垃圾”內(nèi)存。釋放后的指針應(yīng)立即將指針置為NULL,防止產(chǎn)生“野指針”。
參考資料來源:百度百科-野指針
空指針:空指針是一個(gè)特殊的指針值,也是唯一一個(gè)對任何指針類型都合法的指針值。指針變量具有空指針值,表示它當(dāng)時(shí)處于閑置狀態(tài),沒有指向有意義的東西。
通用指針:通用指針,它可以指向任何類型的變量。通用指針的類型用(void *)表示,因此也稱為void 指針。
野指針:野指針也就是指向不可用內(nèi)存區(qū)域的指針。通常對這種指針進(jìn)行操作的話,將會(huì)使程序發(fā)生不可預(yù)知的錯(cuò)誤。
空指針是一個(gè)特殊的指針值,也是唯一一個(gè)對任何指針類型都合法的指針值。指針變量具有空指針值,表示它當(dāng)時(shí)處于閑置狀態(tài),沒有指向有意義的東西??罩羔樣?表示,C語言保證這個(gè)值不會(huì)是任何對象的地址。給指針值賦零則使它不再指向任何有意義的東西。為了提高程序的可讀性,標(biāo)準(zhǔn)庫定義了一個(gè)與0等價(jià)的符號常量NULL.??? 程序里可以寫 p = 0;???? 或者 p = NULL; 兩種寫法都把p置為空指針值。相對而言,前一種寫法更容易使讀程序的人意識(shí)到這里是一個(gè)指針賦值。我們印象中C語言的指針都有類型,實(shí)際上也存在一種例外。
? 這里涉及到通用指針,它可以指向任何類型的變量。通用指針的類型用(void *)表示,因此也稱為void 指針。
? 野指針,也就是指向不可用內(nèi)存區(qū)域的指針。通常對這種指針進(jìn)行操作的話,將會(huì)使程序發(fā)生不可預(yù)知的錯(cuò)誤。
“野指針”不是NULL指針,是指向“垃圾”內(nèi)存的指針。人們一般不會(huì)錯(cuò)用NULL指針,因?yàn)橛胕f語句很容易判斷。但是“野指針”是很危險(xiǎn)的,if語句對它不起作用。野指針的成因主要有兩種:
①指針變量沒有被初始化。任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的,它會(huì)亂指一氣。所以,指針變量在創(chuàng)建的同時(shí)應(yīng)當(dāng)被初始化,要么將指針設(shè)置為NULL,要么讓它指向合法的內(nèi)存。
②指針p被free或者delete之后,沒有置為NULL,讓人誤以為p是個(gè)合法的指針。別看free和delete的名字惡狠狠的(尤其是delete),它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒有把指針本身干掉。通常會(huì)用語句if (p != NULL)進(jìn)行防錯(cuò)處理。很遺憾,此時(shí)if語句起不到防錯(cuò)作用,因?yàn)榧幢鉷不是NULL指針,它也不指向合法的內(nèi)存塊。
意思是說未初始化的指針看似沒指向任何地方,但是其實(shí)默認(rèn)了是指向某個(gè)未知地點(diǎn)的,這個(gè)地點(diǎn)可能是系統(tǒng)的某個(gè)重要的代碼,所以一旦對這個(gè)無知指針的某個(gè)行為改動(dòng)了它所指向的系統(tǒng)代碼,那系統(tǒng)就會(huì)出現(xiàn)問題,至于出現(xiàn)什么問題就難說了。再說老師說這番話是出于程序員的嚴(yán)謹(jǐn),因?yàn)橐且院笤谝粋€(gè)常用程序里加入這種危害性的代碼,那每次運(yùn)行可能都會(huì)讓系統(tǒng)承擔(dān)一次風(fēng)險(xiǎn),但是事實(shí)上出問題的幾率其實(shí)是滿低得。
老師這番話是為了讓學(xué)生們養(yǎng)成嚴(yán)謹(jǐn),無錯(cuò)漏的編程習(xí)慣。 而不是什么危言聳聽。
野指針 指 不知道 指哪去兒去的指針。
strcpy中的s1與s2,如果按照嚴(yán)格的編程設(shè)計(jì)規(guī)則,是應(yīng)該進(jìn)行一些必要的檢查,比如判斷這兩個(gè)指針是不是NULL。但這種檢查很難確定其是否是野指針,這是其一。其次,在C語言中,這種功能很明確的函數(shù),為了追求效率,一般都不會(huì)做太多的檢查,而是由調(diào)用者來確保入口參數(shù)的有效性。