2012-07-12 102 views
1

因此,當目標平臺是32位時,我已經可以在Visual Studio 2005中完美編譯這些代碼。但是,它在64位中不起作用。我不明白爲什麼;事實上,我從來沒有見過一個指針被投射到很久以前。它甚至是正確的C++?在長時間存儲double *(C++)

#define REAL double 
typedef REAL* point; 
point *ptary; //(so it's basically double** ptary?) 
long arylen = (long) ptary[0]; 

在此先感謝。

+3

正確的語言表達方式,但是當人們警告關於表演的時候,正是出於這樣的原因(其中包括缺乏便攜性)。 – 2012-07-12 10:14:31

+0

請注意,在64位Linux和其他平臺上,「long」是64位,所以在將代碼移植到Windows時,這是一個常見錯誤。 – ecatmur 2012-08-09 15:57:29

回答

7

它似乎在32位系統上工作,因爲指針和長度都是32位寬。它無法在64位系統上工作,因爲指針是64位寬,但長(可能)仍然只有32位寬。

您可以通過打印sizeof(double*)sizeof(long)來輕鬆檢查。我的猜測是,在64位系統上,輸出分別是8和4。

如果您需要能夠容納指針的整數類型,請使用<stdint.h>中的intptr_t

+0

另請注意,將指針轉換爲整數(反之亦然)是實現定義的操作。它可以做你期望的一些編譯器/實現,但不是其他的。 'intptr_t'和'uintptr_t'是可選類型。 – dreamlax 2012-07-12 10:27:33

相關問題