C Language Study - 錯誤的指標初始化方式

來源:互聯網
上載者:User

標籤:

本文測試指標初始化的方式:

錯誤初始化方式一:

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 - 錯誤的指標初始化方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.