2014-07-02 74 views
0

我今天在我的工作地點學到了這一點。在發佈我的問題之前,我讀了thisthisthis將void *賦給UINT或unsigned int

這裏是我的資深同事告訴我:

您不能分配無效*爲UINT或unsigned int類型。它不適用於64位。

但是爲什麼?是否因爲void*unsigned int在不同架構上承載不同大小(如其他問題中提到的)或其他問題?

+0

您是否試過'printf(「%u \ n」,sizeof(void *));'將每個編譯器都包含爲標記? – harper

+0

相關:http://www.viva64.com/en/k/0005/總之,是的,在_most_系統上有所不同。 – raina77ow

回答

1

取決於您的應用程序的目標。您標記了VC++並提及類型UINT - 因此您似乎正在爲Windows構建。在32位Windows中,指針大小爲32位,而在64位Windows中則爲64位。但是,類型UINT的大小的定義與Windows版本的32位類似。您可以使用__uint64UINT64特定於MS的類型而不是UINT來確保它足夠大,以便使用指針。您也可以使用專門設計用於匹配指針大小的類型(因此使其對於32/64位風格而言是透明的),這些類型可以使用INT_PTR/UINT_PTR

請參閱http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx以供參考各種數據類型。

當然,所有這些都會使您的程序不能原生移植到其他體系結構/操作系統。

1

你基本上是正確的:它不能保證一個unsigned int在同一臺計算機字長爲void*,這樣你就可以在它們之間不會丟失信息不投。 Here是一個很好的常見問題答案。

要記住的主要是void*是任意的數據指針,而不是一個真正的任意指針。實際上,沒有真正的通用指針這樣的東西:例如,某些機器可能具有不同的程序和數據地址空間,所以指向每個指針的大小可能不同。有關更多信息,請參見this SO answer

+0

雖然void *不是一個通用數據指針是正確的,但問題是void *的大小與整數的大小相比。 – SomeWittyUsername

1

是的,就是這樣。

你的實現然而可提供可選的類型uintptr_t,其被定義爲如下:

以下類型表示具有任何有效 指向void可以轉換爲這個屬性的無符號整數型型,再轉換回指向void, ,其結果將比較等於原始指針:

uintptr_t

也可以使用簽名的對應方intptr_t。這些類型可在<cstdint>標題中找到。

通過選擇使用這些類型,您承認您的代碼只能在您的目標機器上使用提供此類型的實現的子集進行編譯。

1

尺寸顯然是一個展示瓶塞,如果void*不能在unisigned int遊戲結束。但即使sizeof(void*) == sizeof(unsigned int)你有一個類型兼容性問題:一個持有一個數據指針,其他數據。您必須將reinterpret_cast<>()指向另一個,並且所有投注都將關閉,以確保其工作效果。

相關問題