2014-02-17 55 views
1

在「計算機系統:程序員的角度」,第2.1節(第31頁),它說:c指針可以採用的值範圍是多少?

在C指針的值是存儲的一些塊的第一字節的虛擬地址。

對我來說,聽起來像C指針的值可以從0到[虛擬內存大小-1]的值。是這樣嗎?如果是的話,我想知道是否有任何機制檢查程序中的所有指針是否都被賦予合法值 - 值至少爲0,最多爲[虛擬內存大小-1],並且這種機制內置於其中 - 在編譯器中? OS?或者別的地方?

+0

我認爲這是由指針的大小確認,在32位系統中,指針的大小是4字節,而虛擬內存是2^32,所以它總是有效的? – michaeltang

+0

合法值是實施和操作系統特定的。要完成你所尋求的任務,需要一個字面上知道每個指針在你的運行代碼中的位置的系統。大多數分析器尋找*是*有效*的指針,因爲*字節序列是一個有效的內存偏移量),但是*非常少的平臺(我只能想到一個),實際*知道*是否存儲在(a)指針,(b)保存有效地址。 – WhozCraig

+0

指針可以取任何有效的值。但是「有效」有很多方法。零是有效的,但是1肯定不是。一些範圍是有效的,而另一些則不是,這取決於分配給過程的地址範圍。即使地址可能有效也不奇怪,具體取決於架構細節。 –

回答

2

C中的指針是一個抽象對象。 C標準提供的唯一保證是指針可以指向它們在C:函數,對象,一個超過對象末尾和NULL的所有東西。

在典型的C實現中,指針可以指向虛擬內存中的任何地址,並且一些C實現在很大程度上故意支持它。但是,有複雜性。例如,用於NULL的值可能難以用作地址,並且將爲一種類型創建的指針轉換爲另一種類型可能會失敗(由於對齊問題)。此外,還有一些合法的非典型C實現,其中指針不會以正常方式直接與內存地址相關。

不應該期望在不理解C標準和您使用的C實現規則的情況下,任意使用指針訪問內存。

C中沒有機制檢查程序中的指針是否有效。程序員負責正確使用它們。

2

無論如何,沒有任何進程檢查指針的有效性,因爲無效指針的使用具有未定義的效果。

通常,指針將不可能在可尋址範圍外保存一個值,因爲兩者具有相同的可用範圍 - 例如,兩者都是32位。但是,有些CPU有關於指針對齊的規則,可能會使某些類型的數據的某些地址無效。一些運行時(如64位Objective-C,它是C的一個嚴格超集)使用錯誤對齊的指針將文字對象僞裝爲堆上的對象。

也有一些情況下,指令集將完整的地址空間定義爲一件事,但由特定硬件實現爲另一件事。歷史上的一個例子是原來的68000,它定義了一個32位的空間,但只有24個地址線。非常早期的Mac OS使用備用8位來標記描述數據塊的標誌,依靠硬件忽略它們。

所以:

  • 有有效期不運行時檢查;
  • 即使存在,有效性的含義往往取決於具體的CPU模型(不僅僅是家族)或特定版本的操作系統(同上),以便檢查比您預想的更簡單的任務。

實際上,如果您的地址在每個硬件上都是非法的,但是作爲法定處理器異常訪問,通常會發生什麼情況。

0

出於實際的目的,C指針要麼是NULL,要麼是內存地址。我從來沒有聽說過NULL在現實生活中只是零。如果這是一個內存地址,你不應該「關心」實際的數字是什麼;只是通過它,取消引用它等