在C(或C ++)中,指針是特殊的,如果它們的值為零:我建議在釋放內存后將指針設置為零,因為這意味著再次釋放指針并不危險; 當我調用malloc時,如果它無法獲取內存,則返回一個值為零的指針; 我一直用if (p != 0)它來確保傳遞的指針是有效的,等等。但是,由于內存尋址從0開始,因此有效地址不是0嗎?如果是這樣的話,0如何用于處理空指針?為什么不是負數(shù)而是null?編輯:一堆好的答案。我將總結在所表達的答案中所說的內容,因為我自己的思想解釋了它,并希望如果我誤解,社區(qū)將糾正我。就像編程中的其他一切一樣,它是一種抽象。只是一個常量,與地址0并不真正相關.C ++ 0x通過添加關鍵字來強調這一點nullptr。它甚至不是地址抽象,它是C標準指定的常量,并且編譯器可以將其轉換為其他數(shù)字,只要它確保它永遠不等于“真實”地址,并且如果0不是,則等于其他空指針用于平臺的最佳價值。如果它不是抽象,早期就是這種情況,系統(tǒng)使用地址0,程序員不受限制。我承認,我的負面數(shù)字建議是一個狂熱的頭腦風暴。對地址使用有符號整數(shù)有點浪費,如果它意味著除了空指針(-1或其他)之外,值空間在產生有效地址的正整數(shù)和剛剛浪費的負數(shù)之間均勻分配。如果任何數(shù)字總是可以由數(shù)據(jù)類型表示,那么它就是0.(也可能是1。我想的是一位整數(shù),如果是無符號則為0或1,或者只有符號的有符號位,或兩位整數(shù),將是[-2,1]。但是你可以只得0為空,1是內存中唯一可訪問的字節(jié)。)
3 回答

侃侃無極
TA貢獻2051條經驗 獲得超10個贊
從歷史上看,從0開始的地址空間始終是ROM,用于某些操作系統(tǒng)或低級中斷處理例程,如今,由于一切都是虛擬的(包括地址空間),操作系統(tǒng)可以將任何分配映射到任何地址,因此它可以特別是不在地址0分配任何東西。

搖曳的薔薇
TA貢獻1793條經驗 獲得超6個贊
IIRC,“空指針”值不保證為零。編譯器將0轉換為適合于系統(tǒng)的任何“空”值(實際上它可能總是為零,但不一定是)。無論何時將指針與零進行比較,都會應用相同的轉換。因為您只能將指針相互比較并與此特殊值0進行比較,所以它使程序員無法了解有關系統(tǒng)內存表示的任何信息。至于為什么他們選擇0而不是42或者某些,我猜它是因為大多數(shù)程序員從0開始計數(shù):)(另外,在大多數(shù)系統(tǒng)上0是第一個內存地址,他們希望它方便,因為在像我所描述的那樣練習翻譯很少實際發(fā)生;語言只允許它們)。
- 3 回答
- 0 關注
- 988 瀏覽
添加回答
舉報
0/150
提交
取消