【发布时间】:2010-02-16 04:24:53
【问题描述】:
我正在开发一个在 Win32 中构建和运行良好的应用程序。但是,在 x64 中,它会构建但在运行时会崩溃。查看代码并缩小问题范围,如果我注释掉对以下函数的调用,它运行没有问题。
void vec3_copy (double* v1, const double* v2) {
v1[0] = v2[0]; v1[1] = v2[1]; v1[2] = v2[2];
}
我正在使用 C/C++ 编译器在 Visual Studio 2008 中构建。所有更新均已安装。有什么想法吗?
编辑 1(回答 cmets):
指针应该是有效的,就像在 Win32 中一样,它运行良好。没有代码被改变并且没有采用不同的路径,除非指针因为它的 x64 被稍微修改(将调查这个)。
很遗憾,没有关于崩溃的信息。在 Windows 7 中,它只是说它正在寻找问题的解决方案,什么也没找到,然后在命令提示符中返回。在事件查看器中,我能够找到以下信息:
Faulting application name: DRR_C.exe, version: 0.0.0.0, time stamp: 0x4b7a1ee1
Faulting module name: DRR_C.exe, version: 0.0.0.0, time stamp: 0x4b7a1ee1
Exception code: 0xc0000005
Fault offset: 0x0000000000003950
Faulting process id: 0x16a4
Faulting application start time: 0x01caaec078a9c84a
Faulting application path: D:\Development\gpu\dev\DRR_C\x64\Debug\DRR_C.exe
Faulting module path: D:\Development\gpu\dev\DRR_C\x64\Debug\DRR_C.exe
编辑 2(回答更多 cmets):
修改为,
memcpy(v1, v2, 3 * sizeof(double));
新的错误信息具有相同的异常代码和故障偏移量。
【问题讨论】:
-
什么样的崩溃?该代码看起来没问题,只要您确定
v1和v2是有效指针... -
那个代码没问题。您的问题出在导致
v1和v2的调用链中的某个位置,它们在失败的调用中具有它们所具有的特定值(很可能在一些隐式假设32 位指针差异或类似的指针算术中)。除此之外,您真的应该使用memcpy( )来处理这类事情。 -
是否可以不使用 double 作为类型进行分配。即 malloc(sizeof(MACRO) * 3) 其中宏被正确定义为 32 位而不是 64 位。同样使用 memcpy
-
异常代码 0xc0000005 用于访问冲突异常,这意味着您的程序正在尝试读取或写入它不拥有的内存。您能否在调试器下运行您的应用程序并确保 v1 和 v2 的值正常?
-
"指针应该是有效的,就像在 Win32 中一样,它运行良好。"不合逻辑的推论。如果您以某种方式调用未定义的行为(例如通过取消引用错误指针),那么所有的赌注都将被取消。它很容易在一种情况下运行良好,但在另一种情况下却不行。 (不过,我同意您可能会在某处截断地址。)
标签: c++ c visual-studio-2008 winapi 64-bit