2012-09-11 36 views
2

它是否映射到內存中的零頁?如何在Linux系統上實現NULL指針?

+0

@agou:不,Windows VMM不會讓您分配虛擬地址爲零的塊。 –

+0

@agou'*(char *)0'是未定義的行爲,因爲它將一個空指針解引用(0是一個空指針常量)。如果地址0x00有效,爲了獲得一個可用的指針,你必須使用不同的方法。但是沒有可移植的方式。 –

回答

2

這是Linux的事實是無關緊要的。在C中,NULL常量被定義爲'0' - 零。當一個進程試圖在保護模式上下文中取消引用其值爲零的指針時,它會導致處理器引發中斷,然後由操作系統處理該中斷(然後通常傳遞給應用程序的框架,這就是.NET的原因。給你友好的NullReferenceExceptions但C給你更加神祕的錯誤)。

+0

所以如果你解除引用它,它會嘗試訪問虛擬地址空間中的零頁面? – Bruce

+1

在運行時,NULL指針的值不一定爲零。 'char * p = 0;'總是產生一個NULL指針,因爲你使用了一個整型文字。但'char * p; memset(&p,0,sizeof p);'在所有符合的實現上不產生NULL指針。此外,訪問違規是特定於實現的行爲 - 所有標準中關於解除引用不安全派生指針的說法是,您將獲得**未定義行爲**。最終,該平臺非常相關。 –