標籤:
本文測試指標初始化的方式:
錯誤初始化方式一:
int* p = NULL;//此句等於p = NULL;將指標指向了NULL這個地址,(NULL=0x0)
*p = 0x10;//試圖訪問0x0記憶體,被拒絕
錯誤初始化方式二:
int* p;//定義的時候未進行初始化,此時指標指向一塊未知的記憶體
*p = 0x10;//試圖訪問未知記憶體,被拒絕
那麼指標到底如何初始化?
初始化方式參考一:
首先定義一個相應類型的變數,我們稱之為指標初始設定變數,它的作用
就是用來進行指標初始化的,或者程式中可以對它進行其他的利用。
int pinit = 0;
int* p = &pinit;//初始化指標,這個時候p指標就指向了變數pinit的記憶體位址
是一塊合法的地址
初始化方式參考二:
在參考方式一中,首先定義了一個整型變數,那麼我們可以事先擷取它的地址
&pinit 我在Code::Blocks上測試的地址是0x22ff18
int* p = (int*)0x22ff18;//當然,這個地址絕對是合法地址,針對不同的編譯器,
//我建議多預留幾個位元組也可以
*p = 0x10;//便可冠冕堂皇地訪問該記憶體
這樣就省去了一個整型變數的定義,有一種很高端的感覺,有木有?
初始化方式參考三:
int* p = NULL;//其實這個初始化方式不能說錯,但是我們要警惕自己寫出這樣的代碼
如果不小心會發生什麼意外狀況,你得清楚這塊記憶體是不可訪問的(賦值),但是,可以用
指標來指向它,正如你看到一條項鏈,你用手指指著它了,但是你不能去買。
在上述初始化後,在以後的程式裡,在你要使用這個指標之前,先做一下檢測:
if(NULL==p)
{
p = &var1//var1:一個擁有合法地址的你想去訪問的變數,這樣就能使得p指向一個合法地址了
}
else
{
p = &var2//var2:一個擁有合法地址的你想去訪問的變數,這樣就能使得p指向一個合法地址了
}
另外一種的檢測方式:
assert(NULL!=p);//也就是斷言,如果NULL!=p(條件為真)程式就會繼續運行,否則(條件為假)終止運行。
這樣,如果斷言發揮了做用,我們就知道錯誤出現在哪裡了,可以及時的修正bug。
總結:最終還是得讓指標指向一塊合法的可以訪問的記憶體。
C Language Study - 錯誤的指標初始化方式