2013-02-16 88 views
7

我知道: char *是一個指向char的指針。 和 int *是一個指向int的指針。char *的大小與int *的大小相同嗎?

所以,我想確認以下兩件事情:

  1. 所以現在假設我是32位的機器上,那麼這意味着內存地址是32位寬。 因此,這意味着char *和int *的大小都是32位(4個字節),對不對? 也是char * *的大小也與int *的大小相同?

  2. 假設我有: int * ptr;

因此現在做*((char * *)ptr)= 0x154與*((int *)ptr)= 0x514相同,對嗎? (0x514只是任意的隨機存儲器地址)

平臺:我在x86上。

P.S .:我知道類型轉換不是一種建議的編碼方式。但我正在做內核編碼,因此我必須進行類型轉換!

+0

即使標準沒有說出來,我懷疑它會很容易找到一個實際上不同的環境。 – Mysticial 2013-02-16 17:40:12

+0

儘管它們的尺寸在實踐中相同,但它們的對齊要求不是。 – DCoder 2013-02-16 17:41:19

+0

如果您正在執行「內核編碼」,那已經限制了代碼可以運行的平臺數量。檢查OS規範支持的內容。 – 2013-02-16 22:01:36

回答

11

在C指針是not guaranteed to have the same size。現實中大多數實現指針的大小是相同的,但這是編譯器的實現細節。

C Faq

舊的HP 3000系列採用了不同的尋址方案爲字節比字地址 地址;像上述若干 機器因此它使用了字符*不同的表現,比其他指針

取決於所使用的``內存模式'無效* 指針,8086系列處理器(PC 兼容機)可能使用16位數據指針和32位函數指針,反之亦然。

另外*((char *)ptr) = 0x154*((int *)ptr) = 0x154不一樣。因爲您取消了指針的引用,所以將數據寫入char的大小和int的大小到ptr指向的位置。假設一個8位字符和一個32位int,*((char *)ptr) = 0x154將把0x154寫入分配給ptr的存儲器地址,並且*((int *)ptr) = 0x1540x0000000154寫入從分配給ptr的地址開始的4個字節。

+0

簡短的回答,但很好的鏈接。我會建議在你的答案中插入最有趣的句子,例如「舊的,字尋址的Prime機器因需要比字指針(int *'s)更大的字節指針(char *'s)而臭名昭着。」 – 2013-02-16 17:43:58

+0

@ shf301 :我將它編輯爲*((char **)ptr)= 0x154。 – user1599964 2013-02-16 17:53:57

+0

@ user1599964我認爲這是一個拼寫錯誤,因爲在你的例子中有不同的值 - 鑄造成一個char **或一個int *意味着非常不同的東西,並且不能直接比較。他們是不同層面的間接性,甚至不會做同樣的事情。 – shf301 2013-02-16 17:58:37

1

從技術上講,C標準只保證sizeof(char)== 1,其餘的則由實現決定。但在現代x86架構上(例如英特爾/ AMD芯片),這是相當可預測的。

您可能聽說過處理器被描述爲16位,32位,64位等。這通常意味着處理器使用N位整數。由於指針存儲內存地址,並且內存地址是整數,所以這有效地告訴您將有多少位用於指針。 sizeof通常以字節爲單位進行度量,因此爲32位處理器編譯的代碼將報告指針的大小爲4(每個字節32位/ 8位),64位處理器的代碼將報告指針大小爲8 (每個字節64位/ 8位)。這是32位處理器的4GB內存限制的來源 - 如果每個內存地址對應一個字節,爲了尋址更多內存,您需要大於32位的整數。

實際上,指針在16位系統(如果可以找到一個)上的大小爲2,在32位系統上爲4,而在64位系統上爲8,但沒有什麼可以獲得的依靠給定的尺寸

+0

在沒有遇到[標準委員會也考慮過]的36或48位體系結構的情況下,這一切都很順利(http://stackoverflow.com/questions/6971886/exotic-architectures-the-standard-committee-cares-about )。 – 2013-02-16 21:56:13

相關問題