2017-04-03 199 views
1

我想在我的C++項目中使用第三方c庫,這是我在Windows 64位上使用Visual Studio開發的。 32位和64位都編譯成功;鑄造8位長指針

double* foo(){ 
    double* b; long a; long i; 
    /* 
     ... do some stuff to assign values to b, a, i ... 
    */ 
    return ((long)b + a + i); 
} 

的問題是(在Windows上至少)該雙*是由4個字節在x86體系結構表示和8:然而,我在64位上運行時,因爲它下面的發現在外部庫中的一個問題字節x64,所以在返回語句中鑄造b被擰緊。

我的問題是,有沒有一種方法可以從8位表示中「提取」指針b的4個字節的地址,以保持表達式(b+a)有意義?

感謝

+2

請了解位和字節之間的差異,這對有效交流思想非常重要。指針是四個或八個字節,而不是位。 –

+0

我可能會錯過顯而易見的東西,但會簡單地從返回線中移除(長)不能解決問題? – MTilsted

+2

有問題的代碼沒有意義。目前尚不清楚它的設計目標是什麼,因此很難說出什麼是合適的解決方案。如果這是你的代碼,我的建議是避免任何和所有的演員。 –

回答

3

想必劇組是爲了避免對sizeof(double)倍數做指針arithmetric。

您可以使用char *指針完成相同的操作,避免完全避免大小問題。我還添加了回到原來的指針類型代碼丟失。

return (double *)((char *)b + a + i); 

注:你應該知道,你可以輕鬆地創建未對齊指針,如果解除引用這可能會導致未定義行爲。這也是您的原始代碼的問題。

小心;您的代碼看起來非常可疑,並且可能有其他潛在的地雷。

+0

大獎!改變(長)爲(char *)的伎倆。現在,x64版本的行爲與其x86版本完全相同。 – gcaglion

+0

@gcaglion很高興工作。但就像我說的那樣,指針算術使我有些緊張。出於好奇,你能透露圖書館是什麼嗎? – user694733

+0

我從不使用指針算法,但是,正如我寫的,我決定使用現有的第三方外部庫來節省一些時間,而且我確實是這樣。順便說一下,外部代碼來自http://svmlight.joachims。org /(具體來說,svm_learn.c中的函數kernel_cache_clean_and_malloc()) – gcaglion