2012-10-24 19 views
7

使用char *來編寫內存訪問的跨平臺代碼時,是否有任何缺陷?編寫跨平臺代碼時使用char *而不是void *的任何缺陷?

更新:例如,如果地址與該類型的大小對齊,我應該在將一個解除引用的char *轉換爲某種類型(比如int)之前進行檢查?某些體系結構會在未對齊的訪問中返回奇怪的結果嗎?

我正在研究一個播放內存分配器,以更好地瞭解如何調試內存問題。我曾經認爲char *是可取的,因爲它能夠進行指針運算,並將它們解除引用void *,這是真的嗎?以下假設是否始終適用於不同的通用平臺?

sizeof(char) == 1 
sizeof(char*) == sizeof(void*) 
sizeof(char*) == sizeof(size_t) 
+0

除非你解除引用'char'實例,否則你將不得不將'char *'和'void *'同時指向它們指向的任何類型。 – Aesthete

+0

不知道它是否'有保證',但以我的經驗來看,前2個應該是安全的。最後一個...??。 – vdbuilder

回答

5

sizeof(char)==1肯定總是如此。

sizeof(char *) == sizeof(void *)可能總是如此。 C標準要求它們具有相同的表示,這至少強烈地暗示相同的大小。

sizeof(char *) == sizeof(size_t)絕對不能依賴於 - 我知道它是錯誤的實現(雖然它們可能不符合標準,但這不是他們的問題之一)。

+1

謝謝傑瑞。你知道一個與指針大小相同的類型(除了指針類型:))嗎?例如,它應該是32位版本的32位和64位版本的64位。我在印象之下size_t是這樣一種類型。 – UberMongoose

+1

@UberMongoose:首先,注意甚至沒有要求指針都是相同的大小。他們通常會,但不是必需的。在大多數典型情況下,'size_t'也是一樣的,但是不能保證(我知道至少有一些例外)。 MS(舉一個例子)定義了一些類似INT_PTR(與指針大小相同的整數)的類型,但這遠不是通用的。大概你可以做的最好的事情就是在配置頭文件中使用typedef,這樣你就可以在需要的時候修改平臺。 –

+2

intptr_t? 「以下類型指定一個帶符號整數類型,其屬性指向void的任何有效指針都可以轉換爲此類型,然後轉換回void指針,並將結果與​​原始指針」 – rici