2017-04-03 159 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