我试图在我的c++项目中使用第三方c库,这个库是我在Windows64位上使用Visual开发的。成功编译了32位和64位;但是,在运行64位时,我在外部库中发现了一个问题,如下所示:
double* foo(){
double* b; long a; long i;
/*
... do some stuff to assign values to b, a, i ...
*/
return ( (long)b + a + i );
}问题是(至少在windows上) double*在x86体系结构中由4个字节表示,在x64中用8个字节表示,所以返回语句中的b转换就结束了。
我的问题是,是否可以从指针b的8位表示中“提取”指针(b+a)的4字节地址,以便使表达式(b+a)有意义?
谢谢
发布于 2017-04-03 10:37:27
据推测,转换是为了避免对sizeof(double)的倍数执行指针算术。
您可以对char *指针做同样的操作,完全避免大小问题。我还将强制转换添加到丢失代码的原始指针类型中。
return (double *)( (char *)b + a + i );备注:您应该知道,您可以轻松地创建未对齐指针,如果取消引用,这可能导致未定义的行为。这也是您的原始代码的问题。
小心点;您的代码看起来很可疑,而且可能还有其他潜在的挖掘。
https://stackoverflow.com/questions/43182257
复制相似问题