您好,登錄后才能下訂單哦!
這篇文章主要介紹“C語言的野指針與空指針是什么”,在日常操作中,相信很多人在C語言的野指針與空指針是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言的野指針與空指針是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
概念:野指針就是指向的內存地址是未知的(隨機的,不正確的,沒有明確限制的)。
說明:指針變量也是變量,是變量就可以任意賦值。但是,任意數值賦值給指針變量沒有意義,因為這樣的指針就成了野指針,此指針指向的區域是未知(操作系統不允許操作此指針指向的內存區域)。
注:野指針不會直接引發錯誤,操作野指針指向的內存區域才會出問題。
代碼示例:
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. 指針未初始化:指針變量剛被創建時不會自動成為NULL指針,它的缺省值是隨機的,它所指的空間是隨機的。
代碼示例:
int main() { int * p; *p = 20; return 0; }
(個人理解:指針變量有操作系統隨機賦值,未指向一個具體空間,沒有落腳點)
2. 指針越界訪問:指針指向的范圍超出了合理范圍,或者調用函數時返回指向棧內存的指針或引用,因為棧內存在函數結束時會被釋放。
代碼示例:
int main() { int arr[10] = {0}; int *p = arr; for(int i = 0; i <= 11; i++) { *(P++) = i;//當指針指向的范圍超出數組arr的范圍,p變成野指針。 } return 0; }
3 .指針釋放后未置空:有時指針在free或delete后未賦值 NULL,便會使人以為是合法的。其實它們只是把指針所指的內存給釋放掉,但并沒有把指針本身忘記。此時指針指向的就是無效內存。釋放后的指針應立即將指針置為NULL,防止產生“野指針”。
代碼示例:
int main() { int *p = NULL; p = malloc(10 * sizeof(int)); if (!p) { return; } //成功開辟內存,可以操作內存。 free(p); p = NULL; return 0; }
(個人理解:我們前一天住了個賓館,第二天退房了,雖然我們知道一個該房間的門牌號,但是保潔阿姨已經收拾了房間,我們就不知道房間里具體是什么樣的了,所以我們也沒法操作了。)
代碼示例:
int main() { int *p = NULL; int a = 10; p = &a; *p = 20; return 0; }
代碼示例:
int main() { int arr[10] = {0}; int *p = arr; for(int i = 0; i < 10; i++) { *(P++) = i;//嚴格遵守有效范圍。 } return 0; }
代碼示例:
int * test() { int a = 20; return &a; } int main() { int *p = NULL; p = test(); printf("%d\n", *p); return 0; }
這與變量的作用域有關,局部變量存在棧區,當被調函數結束后 ,棧區上局部變量的內存空間被釋放,若再去訪問該空間就不合理了。
當指針p指向的內存空間釋放時,沒有設置指針p的值為NULL。free只是把內存空間釋放了,但是并沒有將指針p的值賦為NULL。
代碼示例:
int main() { int *p = NULL; p = malloc(10 * sizeof(int)); if (!p) { return; } //成功開辟內存,可以操作內存。 free(p); p = NULL;//避免野指針 return 0; }
好的編程習慣可以避免很多問題,道阻且長,但行則將至!!!
*NULL是一個值為0的宏常量:#define NULL ((void )0)
意義:為了標志指針變量沒有指向任何變量(空閑可用),在C語言中,通常把NULL賦值給此指針,這樣就標志此指針為空指針,沒有指向任何空間。
注意:對指針解引用操作可以獲得它所指向的值。但從定義上看,NULL指針并未指向任何東西,因為對一個NULL指針解引用是一個非法的操作,所以在解引用之前,必須確保它不是一個NULL指針。
代碼示例:
void test(){ char *p = NULL; **//給p指向的內存區域拷貝內容** strcpy(p, "1111"); //err char *q = 0x1122; //給q指向的內存區域拷貝內容 strcpy(q, "2222"); //err }
到此,關于“C語言的野指針與空指針是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。