野指標是什麼

2022-05-06 04:36:07 字數 1974 閱讀 9625

野指標問題

神馬是野指標?**來的?有什麼危害?

(1)野指標,就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)

(2)野指標很可能觸發執行時段錯誤( sgmentation fault)

(3)因為指標變數在定義時如果未初始化,值也是隨機的。指標變數的值其實就是別的變數(指標所指向的那個變數)的位址,所以意味著這個指標指向了乙個位址是不確定的變數,這時候去解引用就是去訪問這個位址不確定的變數,所以結果是不可知的。

(4)野指標因為指向位址是不可預知的,所以有3種情況:第一種是指向不可訪問(作業系統不允許訪問的敏感位址,譬如核心空間)的位址,結果是觸發段錯誤,這種算是最好的情況了。第二種是指向乙個可用的、而且沒什麼特別意義的空間(譬如我們曾經使用過但是已經不用的棧空間或堆空間),這時候程式執行不會出錯,也不會對當前程式造成損害,這種情況下會掩蓋你的程式錯誤,讓你以為程式沒問題,其實是有問題的。第三種情況就是指向了乙個可用的空間,而且這個空間其實在程式中正在被使用( 譬如說是程式的乙個變數x),那麼野指標的解引用就會剛好修改這個變數x的值,導致這個變數莫名其妙的被改變,程式出現離奇的錯誤。工般最終都會導致程式崩潰,或者資料被損害,這種危害是最大的。

(5)指標變數如果是區域性變數,則分配在棧上,本身遵從棧的規律(反覆使用,使用完不擦除,所以是髒的,本次在棧上分配到的變數的預設值是上次這個棧空間被使用時餘留下來的值),就決定了棧的使用多少會影響這個預設值。因此野指標的值是有一定規律不是完全隨機,但是這個值的規律對我們沒意義。因為不管落在上面野指標3種情況的哪一種,都不是我們想看到的。

怎麼避免野指標?

(1)野指標的錯誤**就是指標定義了以後沒有初始化,也沒有賦值(總之就是指標沒有明確的指向乙個可用的記憶體空間),然後去解引用。

(2)知道了野指標產生的原因,避免方法就出來了,在指標的解引用之前,定確保指標指向乙個絕對可用的空間

(3)常規的做法是:

第一點:定義指標時,同時初始化為null

第二點:在指標解引用之前,先去判斷這個指標是不是null第三點:指標使用完之後,將其賦值為null

第四點:在指標使用之前,將其賦值繫結給乙個可用位址空間

野指標的防治方案四點絕對可行,但是略顯麻煩。很多人懶得這麼做,那實踐中怎麼處埋?在中小型程式中,自己水平可以把握的情況下,不必嚴格參照這個標準:但是在大型程式,或者自己水平感覺不好把握時,建議嚴格參照這個方法。

include    

p = null;//

使用完指標變數後,記得將其重新賦值為null

}

null到底是什麼?

(1) null在c/c++中定義為:

#ifdef _cplusplus //

定義這個符號就表示當前是c++環境

#define null 0 //

在c++中null就是0

#else

#define null (void *)0 //

在c中null是強制型別轉換為void *的0

#endif

(2)在c語言中,int *p,你可以p = (int * )0,但是不可以p = 0;因為型別不相同。

(3)所以null的實質其實就是0,然後我們給指標賦初值為null,其實就是讓指標指向0位址處。為什麼指向0位址處?兩個原因。第一層原因是0位址處作為乙個特殊位址(我們認為指標指向這裡就表示指標沒有被初始化,就表示是野指標) ;第二層原因是這個位址0位址在一般的操 作系統中都是不可被訪問的,如果c語言程式設計師不按規矩(不檢查是否等於null就去解引用)寫**直接去解引用就會觸發段錯誤,這種已經是最好的結果了。

(4)一般在判斷指標是否野指標時,都寫成

if (null  !=  p)        而不是寫成if (p != null)

原因是:如果null寫在後面, 當中間是==號的時候,有時候容易忘記寫成了=,這時候其實程式已經錯誤,但是編譯器不會報錯。這個錯誤(對新手)很難檢查出來;如果習慣了把null寫在前面,當錯誤的把==寫成了=時,編譯器會報錯,程式設計師會發現這個錯誤。

C語言中「野指標」 「懸空指標」是什麼?

1 野指標 wild pointer 2 懸空指標 dangling pointer 野指標 wild pointer 是沒有被初始化過的指標,所以不確定指標具體指向。例如以下示例 void p 此時 p 是 野指標 因為 野指標 可能指向任意記憶體段,因此它可能會損壞正常的資料,也有可能引發其他未...

什麼是野指標?如何避免野指標?

野指標不是 null指標,它是隨即指向一塊記憶體的指標。野指標是很危險的,會導致記憶體洩漏,if語句對它不起作用。導致野指標的原因有兩種 1 野指標指向了一塊沒有訪問許可權的記憶體。即指標沒有初始化 2 野指標指向了乙個已經釋放的記憶體。因為野指標是因為我們的不良程式設計習慣造成的,所以我們養成良好...

什麼是野指標?野指標的危害?如何避免野指標?

什麼是野指標?野指標是指隨機指向一塊記憶體的指標 野指標的危害?如何避免野指標?我們要在以後養成良好的編碼習慣 1.將沒有指向的指標初始化指向null 指向null的指標不能對他的指向進行修改 2.當想給乙個指標指向的空間賦值時,一定要給這個指標分配空間 malloc 3.當空間分配完後,要檢查這個...