2010-02-16 90 views
1

我正在研究在Win32中構建並運行正常的應用程序。但是,在x64中,它會生成但運行崩潰。查看代碼並縮小問題的範圍,如果我註釋掉對以下函數的調用,它將毫無問題地運行。在x64中的程序崩潰,在Win32中正常工作

void vec3_copy (double* v1, const double* v2) { 
    v1[0] = v2[0]; v1[1] = v2[1]; v1[2] = v2[2]; 
} 

我在Visual Studio 2008中用C/C++編譯器構建。所有更新都已安裝。有任何想法嗎?

EDIT 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 

EDIT 2(回答更多評論):

修改了行,

memcpy(v1, v2, 3 * sizeof(double)); 

新的錯誤信息有相同的異常代碼和故障偏移。

+2

什麼樣的崩潰?該代碼看起來沒問題,只要你確定'v1'&'v2'是有效的指針... – 2010-02-16 04:27:24

+2

任何錯誤消息? – 2010-02-16 04:27:36

+1

該代碼很好。你的問題在調用鏈中的某處,導致'v1'和'v2'具有它們在調用失敗時的特定值(很可能在某些指針算術中隱含地假定了32位指針差異或類似情況)。除此之外,你應該使用'memcpy()'來處理這種事情。 – 2010-02-16 04:34:18

回答

3

它仍然與memcpy崩潰的事實證實壞指針的來源是其他地方,如預期的那樣。

應用程序有多大?它看起來像沿線的某處,指針被截斷爲32位或以其他方式損壞。您很可能需要花費一些時間與調試器一起追蹤確切的位置。

1

首先想到並可能導致此崩潰的是從指針到int然後返回的轉換。在Win32上,指針和int都是32位長,Win64指針可能是64位長,而int可能只有32位長。

相關問題