C語言野指標與空指標專篇解讀 - IT145.com

文章推薦指數: 80 %
投票人數:10人

1. 指標未初始化:指標變數剛被建立時不會自動成為NULL指標,它的預設值是隨機的,它所指的空間是隨機的。

程式碼 ... 首頁 > 軟體 C語言野指標與空指標專篇解讀 2021-11-1713:01:23 一:野指標 概念:野指標就是指向的記憶體地址是未知的(隨機的,不正確的,沒有明確限制的)。

說明:指標變數也是變數,是變數就可以任意賦值。

但是,任意數值賦值給指標變數沒有意義,因為這樣的指標就成了野指標,此指標指向的區域是未知(作業系統不允許操作此指標指向的記憶體區域)。

注:野指標不會直接引發錯誤,操作野指標指向的記憶體區域才會出問題。

程式碼範例: 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.1:野指標的成因 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; } (個人理解:我們前一天住了個賓館,第二天退房了,雖然我們知道一個該房間的門牌號,但是保潔阿姨已經收拾了房間,我們就不知道房間裡具體是什麼樣的了,所以我們也沒法操作了。

) 2.1:規避野指標 1.初始化指標; 程式碼範例: intmain() { int*p=NULL; inta=10; p=&a; *p=20; return0; } 2.避免指標越界; 程式碼範例: intmain() { intarr[10]={0}; int*p=arr; for(inti=0;i<10;i++) { *(P++)=i;//嚴格遵守有效範圍。

} return0; } 3避免返回區域性變數的地址; 程式碼範例: int*test() { inta=20; return&a; } intmain() { int*p=NULL; p=test(); printf("%dn",*p); return0; } 這與變數的作用域有關,區域性變數存在棧區,當被調函數結束後,棧區上區域性變數的記憶體空間被釋放,若再去存取該空間就不合理了。

4.開闢的指標釋放後置為NULL; 當指標p指向的記憶體空間釋放時,沒有設定指標p的值為NULL。

free只是把記憶體空間釋放了,但是並沒有將指標p的值賦為NULL。

程式碼範例: intmain() { int*p=NULL; p=malloc(10*sizeof(int)); if(!p) { return; } //成功開闢記憶體,可以操作記憶體。

free(p); p=NULL;//避免野指標 return0; } 5.養成良好的程式設計習慣; 好的程式設計習慣可以避免很多問題,道阻且長,但行則將至!!! 二:空指標 *NULL是一個值為0的宏常數:#defineNULL((void)0) 意義:為了標誌指標變數沒有指向任何變數(空閒可用),在C語言中,通常把NULL賦值給此指標,這樣就標誌此指標為空指標,沒有指向任何空間。

注意:對指標解除參照操作可以獲得它所指向的值。

但從定義上看,NULL指標並未指向任何東西,因為對一個NULL指標解除參照是一個非法的操作,所以在解除參照之前,必須確保它不是一個NULL指標。

程式碼範例: voidtest(){ char*p=NULL; **//給p指向的記憶體區域拷貝內容** strcpy(p,"1111");//err char*q=0x1122; //給q指向的記憶體區域拷貝內容 strcpy(q,"2222");//err } OK!!!觀眾老爺們,這裡只是介紹了野指標與空指標,如果朋友們覺得有一點點作用的話,希望朋友們能夠給予小菜鳥一點支援!後續繼續給朋友們帶來更好的博文,還希望朋友們能夠繼續關注,小菜鳥致力於把自己的學習經驗與個人理解更多的分享給大家,望大家喜歡與指正。

到此這篇關於C語言野指標與空指標專篇解讀的文章就介紹到這了,更多相關C語言野指標空指標內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com! 相關文章 德漢姆中學就讀條件 MacBook项目2009年学校开始实施MacBook项目,所有师生配备一本MacBook,并同步更新了校园无线网络。

学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。

因此2011 2021-06-0109:32:01 黑科技的輕簡出行,告別「電量焦慮症」:Anker氮化鎵超能充系列 综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果MacBook很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所 2021-06-0109:31:42 吳亦凡廠牌首秀,L4WUDU居然忘詞了,Rapper和明星比還是有差距! 除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、MacOvaSeas、林渝植等人全部出场。

然而让 2021-06-0109:31:34 IPFS、Chia、Bzz和ICP挖礦該怎麼選?哪一個更有優勢? 目前应用IPFS的机构:1谷歌浏览器支持IPFS分布式协议2万维网(历史档案博物馆)数据库3火狐浏览器支持IPFS分布式协议4EOS等数字货币数据存储5美国国会图书馆,历史资料永久保存在IPFS6加 2021-06-0109:31:24 有哪些事是買了雪佛蘭後才知道的?美事偷著樂,開拓者車主隨聊 开拓者的车机是兼容苹果和安卓,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的 2021-06-0109:30:48 iPhone12在618最新定價,跌價幅度超過1400元,還等iPhone13嗎? 不仅是安卓手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。

iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它 2021-06-0109:30:45 熱門文章 1win10升級後無法調整螢幕解析度怎麼辦 2Win7/8.1/10/Office啟用工具使用教學(KMSpico) 3win10下【寬頻連線錯誤813】怎麼辦? 4Excel密碼破解:開啟密碼,保護密碼,VBA密碼 5如何更改AndroidStudio的程式碼字型和顏色 6EXCEL技巧——EXCEL如何製作族譜 7AdobePhotoshopCC官方中文版安裝破解教學 8如何使用PPT製作轉盤抽獎的動畫 9excel表格怎麼設定到期日前自動提醒功能 10如何在Photoshop中開啟並使用pat格式的檔案 IT145.comE-mail:sddin#qq.com



請為這篇文章評分?