C語言中野指標總結

2021-08-10 11:40:22 字數 2811 閱讀 9130

1、野指標是什麼?

2、野指標是如何產生的?有什麼危害?

3、如何避免野指標?

4、null是什麼

1、野指標是什麼?

野指標,就是指標指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)很可能觸發執行時段錯誤(sgmentation fault)

例如:

int

*p; // 區域性變數,分配在棧上,棧反覆被使用,所以p值是隨機的

printf("p = %p.\n",p);

*p = 4; // segmentation fault (core dumped)執行時段錯誤,指標指向不可訪問位置

2、野指標是如何產生的,有什麼危害?

2.1、產生原因?

指標變數如果是區域性變數,則分配在棧上,本身遵從棧的規律(反覆使用,使用完不擦除,所以是髒的,本次在棧上分配到的變數的預設值是上次這個棧空間被使用時餘留下來的值),就決定了棧的使用多少會影響這個預設值。

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

2.2、有什麼危害?

第一種是指向不可訪問(作業系統不允許訪問的敏感位址,譬如核心空間)的位址,結果是觸發段錯誤,這種算是最好的情況了;

第二種是指向乙個可用的、而且沒什麼特別意義的空間(譬如我們曾經使用過但是已經不用的棧空間或堆空間),這時候程式執行不會出錯,也不會對當前程式造成損害,這種情況下會掩蓋你的程式錯誤,讓你以為程式沒問題,其實是有問題的;

第三種情況就是指向了乙個可用的空間,而且這個空間其實在程式中正在被使用(譬如說是程式的乙個變數x),那麼野指標的解引用就會剛好修改這個變數x的值,導致這個變數莫名其妙的被改變,程式出現離奇的錯誤。一般最終都會導致程式崩潰,或者資料被損害。這種危害是最大的。

不管落在上面野指標3種情況的哪一種,都不是我們想看到的。

3、如何避免野指標?

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

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

(3)常規的做法是:

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

第二:在指標解引用之前,先去判斷這個指標是不是null

第三:指標使用完之後,將其賦值為null  

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

**演示:

int a;

int *p = null;

// 中間省略**••••••

p = &a; // 正確的使用指標的方式,是解引用指標前跟乙個絕對可用的位址繫結

//if (p != null)

if (null != p)

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

4、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語言中如何避免野指標

先看乙個例子 struct student stu,pstu intmain void 這是很多人都容易犯的錯誤 定義了結構體變數stu,但結構體內部的char name在定義結構體時只是為其分配了4位元組的記憶體,沒有指向乙個合法的位址,這時其指標指向的區域只是一些亂碼,有事還沒有訪問許可權。這就...

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

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

c語言野指標

1.什麼是野指標 野指標是隨機指向一塊記憶體的指標,容易造成記憶體洩露。但不一定每次都會產生段錯誤,因為可能分配到已經分配或申請過的位址。2.如何避免野指標 避免野指標需要養成一下良好的編碼習慣 1 當指標沒有指向時,給它置為空 0位址 null 因為在作業系統中,不能對0位址進行任何操作 置為空 ...