我正在开发一个在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(回答评论):
指针应该是有效的,就像在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(回答更多评论):
将行修改为,
memcpy(v1, v2, 3 * sizeof(double));
新错误信息具有相同的异常代码和错误偏移。
答案 0 :(得分:4)
它仍然与memcpy
崩溃的事实证实了坏指针的来源在其他地方,正如预期的那样。
申请有多大?它看起来像沿线的某个地方,指针被截断为32位或以其他方式被破坏。很可能您需要花一些时间与调试器一起追踪确切的位置。
答案 1 :(得分:2)
首先想到的并且可能导致此崩溃的是从指针转换为int然后返回。在Win32上,指针和int都是32位长,在Win64指针上可能是64位长,而int可能只有32位长。