概念:野指針就是指向的內存地址是未知的(隨機的,不正確的,沒有明確限制的)。
說明:指針變量也是變量,是變量就可以任意賦值。但是,任意數值賦值給指針變量沒有意義,因為這樣的指針就成了野指針,此指針指向的區域是未知(操作系統不允許操作此指針指向的內存區域)。
注:野指針不會直接引發錯誤,操作野指針指向的內存區域才會出問題。
代碼示例:
inta=100;int*p;p=a;//把a的值賦值給指針變量p,p為野指針,ok,不會有問題,但沒有意義p=0x12345678;//給指針變量p賦值,p為野指針,ok,不會有問題,但沒有意義*p=1000;//對野指針進行賦值操作就不可以了
把a的值賦值給指針變量p,p為野指針, ok,不會有問題,但沒有意義。
給指針變量p賦值,p為野指針, ok,不會有問題,但沒有意義。
1. 指針未初始化:指針變量剛被創建時不會自動成為NULL指針,它的缺省值是隨機的,它所指的空間是隨機的。
代碼示例:
intmain(){int*p;*p=20;return0;}
(個人理解:指針變量有操作系統隨機賦值,未指向一個具體空間,沒有落腳點)
2. 指針越界訪問:指針指向的范圍超出了合理范圍,或者調用函數時返回指向棧內存的指針或引用,因為棧內存在函數結束時會被釋放。
代碼示例:
intmain(){intarr[10]={0};int*p=arr;for(inti=0;i<=11;i++){*(P++)=i;//當指針指向的范圍超出數組arr的范圍,p變成野指針。}return0;}
3 .指針釋放后未置空:有時指針在free或delete后未賦值 NULL,便會使人以為是合法的。其實它們只是把指針所指的內存給釋放掉,但并沒有把指針本身忘記。此時指針指向的就是無效內存。釋放后的指針應立即將指針置為NULL,防止產生“野指針”。
代碼示例:
intmain(){int*p=NULL;p=malloc(10*sizeof(int));if(!p){return;}//成功開辟內存,可以操作內存。free(p);p=NULL;return0;}
(個人理解:我們前一天住了個賓館,第二天退房了,雖然我們知道一個該房間的門牌號,但是保潔阿姨已經收拾了房間,我們就不知道房間里具體是什么樣的了,所以我們也沒法操作了。)
代碼示例:
intmain(){int*p=NULL;inta=10;p=&a;*p=20;return0;}
代碼示例:
intmain(){intarr[10]={0};int*p=arr;for(inti=0;i<10;i++){*(P++)=i;//嚴格遵守有效范圍。}return0;}
代碼示例:
int*test(){inta=20;return&a;}intmain(){int*p=NULL;p=test();printf("%d\n",*p);return0;}
這與變量的作用域有關,局部變量存在棧區,當被調函數結束后 ,棧區上局部變量的內存空間被釋放,若再去訪問該空間就不合理了。
當指針p指向的內存空間釋放時,沒有設置指針p的值為NULL。free只是把內存空間釋放了,但是并沒有將指針p的值賦為NULL。
代碼示例:
intmain(){int*p=NULL;p=malloc(10*sizeof(int));if(!p){return;}//成功開辟內存,可以操作內存。free(p);p=NULL;//避免野指針return0;}
好的編程習慣可以避免很多問題,道阻且長,但行則將至!!!
*NULL是一個值為0的宏常量:#define NULL ((void )0)
意義:為了標志指針變量沒有指向任何變量(空閑可用),在C語言中,通常把NULL賦值給此指針,這樣就標志此指針為空指針,沒有指向任何空間。
注意:對指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針并未指向任何東西,因為對一個NULL指針解引用是一個非法的操作,所以在解引用之前,必須確保它不是一個NULL指針。
代碼示例:
voidtest(){char*p=NULL;**//給p指向的內存區域拷貝內容**strcpy(p,"1111");//errchar*q=0x1122;//給q指向的內存區域拷貝內容strcpy(q,"2222");//err}
到此,關于“C語言的野指針與空指針是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注本站網站,小編會繼續努力為大家帶來更多實用的文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
根據國家網貸的規定,捷信是屬于高利貸,對于超過國家規定的貸款利率部分是需要退還給用戶的,那么捷信退利息是在哪里退?捷信辦理退息是需要通過關注“聚投訴”微信公眾號,按照公眾號的提示進行操作并提交好有關貸款的證明資料之后,就會有捷信官方工作人員聯系用戶辦理退息手續。需要注意的是,捷信退息退還的只是超出國家規定范圍內的利息。捷信怎么退利息流程【1】首先借款人要準備借款證明、利息證...
盤地而坐是什么生肖動物?猴子。猴子盤腿可以坐下,能屈能伸,拿東西像人一樣穩當,一只公猴子可以和多只母猴子交配,在叢林間蕩來蕩去也沒問題。席地而坐極隨意指的是生肖豬,豬是雜食類哺乳動物,也是五畜之一。它身體肥壯、四肢短小、鼻口較長、體肥肢短,性溫馴,適應力強。毛發較粗硬,根據品種不同可分為白色、粉色、黑色、棕色及花色。(資料圖片)盤子在12生肖是哪個生肖1、十二生肖里邊除了馬和牛吃食物用槽之外,豬、...
網商銀行是哪個銀行?網商銀行是一家商業銀行、 私營銀行及其沒有營業網點的互聯網銀行,網商銀行必須利用網絡來給予綜合性金融服務。因為沒有營業網點,而客脅理的網商銀行銀行卡,銀行積會有卡號,不存在實體卡片,這類卡必須關聯第三方支付手機軟件才可以使用。網商銀行是一家什么性質的銀行?網商銀行就是一家民營性質的商業銀行,以互聯網為平臺,小存小貸,純互聯網運營,沒有實體網點和現金業務,也沒有分行設立。網商銀行...