2016-10-03 318 views
-3

首先請原諒我有限的c知識,但我怎麼可以在32位和64位平臺上投入一個字符指針爲長?此代碼給了我與Visual Studio編譯器警告C4311 2015鑄造字符指針長

char *c; 
long l; 
l = (long)(c); 

感謝

編輯

錯誤代碼是'類型轉換':從 '字符*' 到 '長'指針截斷 可以downvotes讓我知道他們爲什麼downvoted?

+2

爲什麼你認爲這是合理的**不包括警告信息??!? – Amit

+0

什麼是警告信息?有許多編譯器警告,我們怎麼可能知道哪一個_you_遇到過? –

+1

你想用這個做什麼? – ZenJ

回答

4

不要這樣做,如果你能避免它。

C99(和更新)支持一種名爲uintptr_t的類型。這是一個能夠保存指針值的整數類型。有關更多信息,請參閱stddef.h

Visual Studio不知道完全支持C99。因此,你可能無法工作,但值得一試。

char* c = <some value>; 
uintptr_t ptr = (uintptr_t)c; 

如果您編譯C源文件作爲C++源,(使用/TC編譯器選項),你應該能夠使用它。

1

將指針指向整數的目的是什麼?你可以使用一個聯合體,一個結構體,或者一個void *。

Microsoft編譯環境默認爲LLP64,其中long爲32位寬,如果您的指針爲64位寬,則可能太窄。 - >https://msdn.microsoft.com/en-us/library/cc953fe1.aspx

+1

我相信例程是計算一個因爲它正在執行自己的堆棧處理,所以使用intptr_t或uintptr_t是一種解決方案? –

+0

simon-p-r,在這種情況下,還有size_t和ptrdiff_t數據類型,但我認爲將指針存儲爲整數是濫用行爲,導致代碼難以閱讀。我的建議就是 – user602469

+0

好吧,我感謝您的意見 –