令人驚訝的NULL類指標

2021-06-06 12:03:18 字數 1290 閱讀 1180

null,在c/c++常用來表示空指標,即指向位址為0的指標。

通常在指標初始化 或者 釋放指標所指向空間後,將指標置為null,防治導致懸浮指標也使其表明自己未指向分配的空間。

這樣看來指向null的指標僅僅如此?

當然我們也常常用一些小技巧來做一些很實用的事情比如,求struct中某個變數的偏移位置:

#define valueoffset(stype, vname)   (int)(&((stype *)null)->vname)
即使指向空的指標也能為我們程式做這麼多事情,真有意思;而本人遇到的令人驚訝的問題,也和null指標扯上了關係。

先來看一段**:

#include using namespace std;

class base

void suprise() };

void main()

在謹慎的閱讀完這段**後,或許能夠做出正確的判斷,但給人的第一感覺執行錯誤。

(直覺是人根據以往的經驗和現場的環境做出的迅速的判斷,慢慢的分析後得出的結果反而未必更加接近答案。)

但這次的確直覺錯了,程式能夠正常執行,並且能夠很順利的列印出"suprise";

(1)仔細分析示例**後,會發現suprise()成員函式位址是不變的(非虛函式,無需動態繫結),在編譯階段根據ptest的指標型別就能得出suprise()函式呼叫的位址;進行呼叫,彙編**更加清晰得證明了這一點:

base *ptest = null;

004119fe mov dword ptr [ptest],0

ptest->suprise();

00411a05 mov ecx,dword ptr [ptest]

00411a08 call base::suprise (411032h)

如果是虛函式,我們這需要根據其指向的物件的虛表指標和虛函式偏移找到其相應的函式體入口,這個過程也成為動態繫結過程。

(2)除了(1)保證了函式的正確執行,其實還隱含了乙個條件,那就是在ptest->suprise中並沒有對其成員變數進行操作。

因為suprise函式隱含了this指標,沒有對成員變數進行操作,那麼this指標為null也不會產生記憶體訪問衝突錯誤。

void suprise(base * const this)

綜合上述:suprise的非虛函式和函式中沒有對成員變數進行操作保證了null類指標成功對方法的呼叫。

2023年3種令人驚訝的雲趨勢 您首先在這裡聽到了

關於2019年和2020年雲計算的 開始出現,我看不到任何尚不明顯的東西。諸如 雲服務的增長 和 安全性將更加重要 之類的 是如此明顯,以至於只有那些處於昏迷狀態的人才能看到它們的到來。真是的,你們比那更好。什麼是雲計算?您現在需要知道的一切 另外 infoworld可幫助您確定適合該工作的工具 a...

谷歌發布了令人驚訝的畫素6和畫素6專業版更新

pixel 6和pixel 6 pro現在迎來了一次意外的月中更新。目前唯一已知的更改是內部版本號中的一位數字。谷歌從sd1a.210817.036公升級到sd1a.2www.cppcns.com1081d edr7.037,兩個版本都在11月份的補丁中。droid life story評論部分的兩...

心得分享 C類成員指標預設不為NULL的原因

今天早上碰到乙個詭異的問題 修改c類時,為其新增了乙個指標成員,然後在析構函式中delete。改完後按ctrl shift b 執行。結果在模擬器上報錯kern exec 3。c類會預設初始化指標為null,所以析構函式中delete應該不會有問題,除錯,原因是delete指標出錯,發現該指標的確不...