C語言野指針及如何規(guī)避詳解
1:什么是野指針?
野指針:就是指針指向的位置是不可知(隨機(jī)性,初始化,不正確,沒有明確限制),指針變量在定義時如果未初始化,其值是隨機(jī)的,指針變量的值是別的變量的地址,意味著指針指向了一個地址是不確定的變量,此時去解引用就是去訪問了一個不確定的地址,所以結(jié)果是不可知的。
指針越界也會導(dǎo)致野指針問題,這里解釋下:就是當(dāng)你指針指向的范圍超過數(shù)組名范圍時,那么那個指針就是野指針了。
2:如何規(guī)避野指針
指針變量的初始化
int a = 10; int* pa = &a; //指針變量的初始化
指針常見錯誤
引用未初始化的指針變量
試圖引用未初始化的指針變量是初學(xué)者最容易犯的錯誤。未初始化的指針變量就是“野”指針,它指向的是無效的地址。
有些書上說:“如果指針變量不初始化,那么它可能指向內(nèi)存中的任何一個存儲單元,這樣就會很危險。如果正好指向存儲著重要數(shù)據(jù)的內(nèi)存單元,而且又不小心向這個內(nèi)存單元中寫入了數(shù)據(jù),把原來的重要數(shù)據(jù)給覆蓋了,這樣就會導(dǎo)致系統(tǒng)崩潰。”這種說法是不正確的!如果真是這樣的話就是編譯器的一個嚴(yán)重的 BUG!
指針越界訪問
#include<stdio.h> int main(void) { int arr[10] = { 0 }; int i = 0; int* p = arr; //接收arr數(shù)組首元素的地址 for (i = 0; i <= 12; i++)//當(dāng)i=10的時候已經(jīng)是非法訪問內(nèi)存了,因?yàn)椋覕?shù)組名的常量表達(dá)式內(nèi)容只有10個元素。 { *p = i; //i每次循環(huán)賦值給指針p p++; //指針自增+1,代指arr元素+1 //*p++ = i 也是可以,這里雖說++優(yōu)先級更高,但是它是后置運(yùn)算符 } return 0; }
指針變量越界數(shù)組導(dǎo)致野指針問題!
指針指向的空間如果我們還回去的話,就把指針指針置為NULL
NULL——空指針,用來初始化指針或者給指針賦值,可以轉(zhuǎn)到定義看看 #define NULL ((void *)0)
說的簡單一點(diǎn)就是:當(dāng)你指針不知道怎么賦值,就賦值給一個空指針 NULL
Null是在計算中具有保留的值,用于指示指針不引用有效對象。程序通常使用空指針來表示條件,例如未知長度列表的結(jié)尾或未執(zhí)行某些操作; 這種空指針的使用可以與可空類型和選項(xiàng)類型中的Nothing值進(jìn)行比較。
空指針不應(yīng)與未初始化的指針混淆:保證空指針與指向有效對象的任何指針進(jìn)行比較。但是,根據(jù)語言和實(shí)現(xiàn),未初始化的指針可能沒有任何此類保證。它可能與其他有效指針相等; 或者它可能比較等于空指針。它可能在不同的時間做兩件事。
int a = 10; int* pa = &a; printf("%d\n", *pa); *pa = 20; //此時當(dāng)我們不想用它時候 pa = NULL; //就把pa指針置成NULL printf("%d\n",pa);
指針使用之前檢查有效性
當(dāng)你指針變量不可以用的時候就把它設(shè)置成NULL,當(dāng)你指針變量可以用的時候就不是NULL。
就是當(dāng)我們對這個指針進(jìn)行初始化的話,那么它就是有效的,如果沒有初始化那么就是無效的。
if (pa != NULL) { //進(jìn)行使用 } if (pa == NULL) { //不進(jìn)行使用 }
以上就是C語言野指針及如何規(guī)避詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言野指針規(guī)避的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)
這篇文章主要介紹了C++函數(shù)參數(shù)匹配規(guī)則,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08VC6.0代碼自動提示 VC6.0在win7環(huán)境下代碼提示智能化
作為程序猿的你,是否已經(jīng)喜歡或習(xí)慣依賴IDE開發(fā)環(huán)境呢,有了IDE環(huán)境,即使你想不起方法全名,只要知道某個前綴,或哪怕在提示列表中,一一查詢,也可以找到自己想找的方法或?qū)傩?/div> 2013-01-01C++使用標(biāo)準(zhǔn)庫實(shí)現(xiàn)事件和委托以及信號和槽機(jī)制
這篇文章主要為大家詳細(xì)介紹了C++如何使用標(biāo)準(zhǔn)庫實(shí)現(xiàn)事件和委托以及信號和槽機(jī)制,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下2022-11-11基于C語言實(shí)現(xiàn)計算生辰八字五行的示例詳解
生辰八字,簡稱八字,是指一個人出生時的干支歷日期;年月日時共四柱干支,每柱兩字,合共八個字。這篇文章主要介紹了C語言實(shí)現(xiàn)計算生辰八字五行的示例代碼,需要的可以參考一下2023-03-03最新評論