【发布时间】:2017-08-28 04:18:39
【问题描述】:
我正在尝试在我的 c++ 项目中使用第 3 方 c 库,我在 64 位 Windows 上使用 Visual Studio 开发该库。 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 个字节表示,因此在 return 语句中强制转换 b 是错误的。
我的问题是,有没有办法可以从指针b 的 8 位表示中“提取”其 4 字节地址,从而保持表达式 (b+a) 有意义?
谢谢
【问题讨论】:
-
请了解位和字节的区别,这对于有效交流思想至关重要。指针是四个或八个字节,而不是位。
-
我可能会错过一些明显的东西,但是从返回行中简单地删除(长)不能解决问题吗?
-
有问题的代码是零意义的。目前尚不清楚它的设计目的是什么,因此很难说什么是适当的修复。如果是你的代码,我的建议是避免任何和所有的演员表。
-
@n.m.我认为铸造是为了使加法表现得好像 a 和 i 是以字节为单位的数量,而不是双倍。问题可能是因为 Windows 64 上的
long可能只有 32 位,所以指针会被截断。 -
如果这是第三方库代码,我会把它扔掉,或者至少 非常 重新编译它,最高警告级别,所有警告都被视为错误,然后手动分析每个警告并思考如何消除它。
标签: c pointers 32bit-64bit