摘要:避免野指針養(yǎng)成良好的編程習(xí)慣好的編程習(xí)慣可以避免很多問題,道阻且長,但行則將至二空指針是一個值為的宏常量意義為了標(biāo)志指針變量沒有指向任何變量空閑可用,在語言中,通常把賦值給此指針,這樣就標(biāo)志此指針為空指針,沒有指向任何空間。
全網(wǎng)最接地氣的C語言野指針介紹,此處對于野指針與空指針知識點做一些簡要的介紹,作者實屬初學(xué),寫博客也是作者學(xué)習(xí)的一個過程,難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請朋友們不吝指正,希望大家多多給予支持,贈人玫瑰,手有余香!
概念:野指針就是指向的內(nèi)存地址是未知的(隨機的,不正確的,沒有明確限制的)。
說明:指針變量也是變量,是變量就可以任意賦值。但是,任意數(shù)值賦值給指針變量沒有意義,因為這樣的指針就成了野指針,此指針指向的區(qū)域是未知(操作系統(tǒng)不允許操作此指針指向的內(nèi)存區(qū)域)。
注:野指針不會直接引發(fā)錯誤,操作野指針指向的內(nèi)存區(qū)域才會出問題。
代碼示例:
int a = 100;int *p;p = a; //把a的值賦值給指針變量p,p為野指針, ok,不會有問題,但沒有意義p = 0x12345678; //給指針變量p賦值,p為野指針, ok,不會有問題,但沒有意義*p = 1000; //對野指針進行賦值操作就不可以了
把a的值賦值給指針變量p,p為野指針, ok,不會有問題,但沒有意義。
給指針變量p賦值,p為野指針, ok,不會有問題,但沒有意義。
1. 指針未初始化:指針變量剛被創(chuàng)建時不會自動成為NULL指針,它的缺省值是隨機的,它所指的空間是隨機的。
代碼示例:
int main(){ int * p; *p = 20; return 0;}
(個人理解:指針變量有操作系統(tǒng)隨機賦值,未指向一個具體空間,沒有落腳點)
2. 指針越界訪問:指針指向的范圍超出了合理范圍,或者調(diào)用函數(shù)時返回指向棧內(nèi)存的指針或引用,因為棧內(nèi)存在函數(shù)結(jié)束時會被釋放。
代碼示例:
int main(){ int arr[10] = {0}; int *p = arr; for(int i = 0; i <= 11; i++) { *(P++) = i;//當(dāng)指針指向的范圍超出數(shù)組arr的范圍,p變成野指針。 } return 0;}
3 .指針釋放后未置空:有時指針在free或delete后未賦值 NULL,便會使人以為是合法的。其實它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒有把指針本身忘記。此時指針指向的就是無效內(nèi)存。釋放后的指針應(yīng)立即將指針置為NULL,防止產(chǎn)生“野指針”。
代碼示例:
int main(){ int *p = NULL; p = malloc(10 * sizeof(int)); if (!p) { return; } //成功開辟內(nèi)存,可以操作內(nèi)存。 free(p); p = NULL; return 0;}
(個人理解:我們前一天住了個賓館,第二天退房了,雖然我們知道一個該房間的門牌號,但是保潔阿姨已經(jīng)收拾了房間,我們就不知道房間里具體是什么樣的了,所以我們也沒法操作了。)
1. 初始化指針;
代碼示例:
int main(){ int *p = NULL; int a = 10; p = &a; *p = 20; return 0;}
2. 避免指針越界;
代碼示例:
int main(){ int arr[10] = {0}; int *p = arr; for(int i = 0; i < 10; i++) { *(P++) = i;//嚴(yán)格遵守有效范圍。 } return 0;}
3 避免返回局部變量的地址;
代碼示例:
int * test(){ int a = 20; return &a;}int main(){ int *p = NULL; p = test(); printf("%d/n", *p); return 0;}
這與變量的作用域有關(guān),局部變量存在棧區(qū),當(dāng)被調(diào)函數(shù)結(jié)束后 ,棧區(qū)上局部變量的內(nèi)存空間被釋放,若再去訪問該空間就不合理了。
4. 開辟的指針釋放后置為NULL;
當(dāng)指針p指向的內(nèi)存空間釋放時,沒有設(shè)置指針p的值為NULL。free只是把內(nèi)存空間釋放了,但是并沒有將指針p的值賦為NULL。
代碼示例:
int main(){ int *p = NULL; p = malloc(10 * sizeof(int)); if (!p) { return; } //成功開辟內(nèi)存,可以操作內(nèi)存。 free(p); p = NULL;//避免野指針 return 0;}
5. 養(yǎng)成良好的編程習(xí)慣;
好的編程習(xí)慣可以避免很多問題,道阻且長,但行則將至!!!
*NULL是一個值為0的宏常量:#define NULL ((void )0)
意義:為了標(biāo)志指針變量沒有指向任何變量(空閑可用),在C語言中,通常把NULL賦值給此指針,這樣就標(biāo)志此指針為空指針,沒有指向任何空間。
注意:對指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針并未指向任何東西,因為對一個NULL指針解引用是一個非法的操作,所以在解引用之前,必須確保它不是一個NULL指針。
代碼示例:
void test(){ char *p = NULL; **//給p指向的內(nèi)存區(qū)域拷貝內(nèi)容** strcpy(p, "1111"); //err char *q = 0x1122; //給q指向的內(nèi)存區(qū)域拷貝內(nèi)容 strcpy(q, "2222"); //err }
OK!!!觀眾老爺們,這里只是介紹了野指針與空指針,如果朋友們覺得有一點點作用的話,希望朋友們能夠給予小菜鳥一點支持!后續(xù)繼續(xù)給朋友們帶來更好的博文,還希望朋友們能夠繼續(xù)關(guān)注,小菜鳥致力于把自己的學(xué)習(xí)經(jīng)驗與個人理解更多的分享給大家,望大家喜歡與指正。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/123615.html
摘要:如果我們要將的地址保存到中,我們需要我們給指針變量相應(yīng)的類型。類型的指針是為了存放類型變量的地址這里可以看到,指針的定義方式是類型名指針變量名。如下最后本文介紹的是指針的基礎(chǔ)知識,往后還會繼續(xù)深入講解指 ...
摘要:在位機器上,如果有個地址線,那一個指針變量的大小是個字節(jié),才能存放一個地址。就是一個指針變量,也有自己的類型,指針變量的類型我們可以發(fā)現(xiàn)指針的定義方式是類型星號。也就是說存儲什么變量類型就用什么指針變量類型。 ...
摘要:一指針概述指針是個變量存放內(nèi)存單元的地址編號。即存放指針變量的地址的指針二級指針指向的空間的值是一個一級指針。總結(jié)指針是語言非常重要的一部分內(nèi)容繁多不易懂本文僅介紹了一些基本知識后續(xù)還會深入了解指針。 ...
閱讀 3167·2021-11-22 15:25
閱讀 3838·2021-11-17 09:33
閱讀 3360·2021-11-08 13:15
閱讀 3044·2021-09-22 10:56
閱讀 535·2021-08-31 09:45
閱讀 2745·2019-08-30 13:49
閱讀 3072·2019-08-30 12:52
閱讀 1136·2019-08-29 17:05