談談對野指標的理解

2021-09-18 06:55:42 字數 1505 閱讀 1670

野指標說白了就是指向不明確或者指向沒有意義的指標,野指標的產生歸咎於以下3種情況。

首先說一下空指標(null pointer),空指標不指向任何物件或者函式,反過來說任何物件或者函式的位址都不能是空指標。空指標如何建立?

int * pt=null;
空指標null和記憶體首位址0x0的區別?

空指標不指向任何物件,指標值為0x0,但對指標進行解除引用*pt是沒有意義的,因為它不指向實際的記憶體。記憶體0位址的位址值也是0x0,但是對記憶體0位址解除引用是有意義的。

情況1:定義了乙個指標,但是並沒有初始化,此時指標的指向是不明確的。

//指標pi和pd指向不明確,並不知道具體指向了記憶體的哪個位置

int * pi;

double * pd;

情況2:我們有時候需要通過動態記憶體分配(new或者malloc)分配一段記憶體塊,並且定義了對應的指標指向該記憶體塊。當程式結束時,需要通過(free或delete)**記憶體。如下所示,分配了兩段64bytes的記憶體,並且由pt1和pt2指向。

//動態記憶體分配和記憶體**

int * pt1=(int *)malloc(16*sizeof(int));

int * pt2=new int [16];

//顯示指標指向的記憶體位址值和記憶體儲存的值

printf("%p %p \n",pt1,pt2);

printf("%d %d \n",*pt1,*pt2);

//記憶體**

free(pt1);

delete pt2;

//顯示指標指向的記憶體位址的值和記憶體儲存的值

printf("%p %p \n",pt1,pt2);

printf("%d %d \n",*pt1,*pt2); //這一行將會出錯

//將pt1和pt2變成空指標

pt1=pt2=null;

由動態記憶體分配的兩段記憶體經過**後,程式已經無法再通過指標pt1和pt2訪問記憶體中的資料,但是指標仍然指向這段記憶體塊,即指標的值仍然不變,此時指標pt1和pt2便成為了野指標。為了防止野指標的產生,避免非法訪問,可以將野指標轉化為空指標(null)。

情況3:當指標的儲存週期大於指標所指向的變數的儲存週期時,當變數的作用域結束之後,對應的指標便成為了野指標。

如下**,for迴圈屬於乙個**段,num的作用域為for迴圈體,迴圈結束後,num的記憶體便會被**,num變數不再存在。指標pt位於for迴圈之外,因此作用域包括但不侷限於for迴圈,因此迴圈結束後,pt仍然存在,且指向原來num所在的記憶體位置,然而這段記憶體已經被**,因此指向無意義,pt成為野指標。

//宣告乙個全域性變數指標pt並初始化為空指標,不指向任何物件

int * pt=null;

for(int i=0;i<10;i++)

野指標的理解

如果乙個指標指向的記憶體沒有訪問許可權,或者指向一塊已經釋放掉的記憶體,那麼就無法對該指標進行操作,這樣的指標稱為野指標 wild pointer 請看下面的 include int main 在gcc下執行,輸入乙個字串後會提示段錯誤 segment fault 在vs下執行,輸入乙個字串後會提示...

c 野指標(迷途指標)的理解

date 2018.12.16 直接上程式 include using namespace std int main int pint new int pint 10 cout pint迷途指標也叫懸浮指標,失控指標,是對乙個指標delete後 這樣會釋放它所指向的記憶體 並沒有把它設定為空時產生的...

談談對MVC的理解

mvc是一種設計模式,它把應用程式拆分為模型物件,檢視物件,控制器物件三大部分.一.模型物件 模型物件封裝了應用程式的資料,模型物件更改時,會通知控制器物件,控制器物件更新相應的檢視物件.二 檢視物件 檢視物件應用程式中使用者所看得到的,其主要目的是顯示應用程式中模型物件的資料,在應用程式中,所有的...