我在Windows 7 - 64位,使用VS2010。下面的代碼在Win32中生成沒有問題,併產生預期結果(兩個8乘8的矩陣,所有元素的值爲1,第三個8乘8矩陣顯示內存地址)。爲什麼C代碼會像Win32構建一樣工作,但是x64構建失敗?
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void) {
int rows, cols, i, x, y;
int **array_of_pointers, *arr2d;
rows = 8;
cols = 8;
arr2d = (int *) malloc(rows * cols * sizeof(int));
for(i = 0; i < rows*cols; i++) {
*(arr2d + i) = 1;
}
for(y = 0; y < cols; y++) {
printf("\n");
for(x = 0; x < rows; x++) {
printf("%d ",*(arr2d + y * cols + x));
}
}
array_of_pointers = (int **) malloc(rows * cols * sizeof(int));
//I want each element of this array_of_pointers to point to the corresponding element of arr2d
for(y = 0; y < cols; y++) {
for(x = 0; x < rows; x++) {
*(array_of_pointers + y * cols + x) = (arr2d + y * cols + x);
}
}
//now try printing from pointer array
printf("\n");
for(y = 0; y < cols; y++) {
printf("\n");
for(x = 0; x < rows; x++) {
printf("%d ",**(array_of_pointers + y * cols + x));
}
}
//now try printing addresses from pointer array
printf("\n");
for(y = 0; y < cols; y++) {
printf("\n");
for(x = 0; x < rows; x++) {
printf("%d ",*(array_of_pointers + y * cols + x));
}
}
free(arr2d);
free(array_of_pointers);
_getch();
return 0;
}
然而,試圖在x64編譯我呈現在輸出窗口中出現以下錯誤消息時:
'的test.exe':已加載「C:\我的代碼\測試\ 64 \ Debug \ test.exe',符號已加載。
'的test.exe':已加載 'C:\ WINDOWS \ SYSTEM32 \ NTDLL.DLL',無法找到或打開PDB文件
'的test.exe':已加載「C:\ WINDOWS \ SYSTEM32 \ KERNEL32.DLL '無法找到或打開PDB文件
'的test.exe':已加載 'C:\ WINDOWS \ SYSTEM32 \ KernelBase.dll',無法找到或打開PDB文件
' 測試。 exe':加載'C:\ Windows \ System32 \ msvcr100d.dll',加載符號。
檢測到嚴重錯誤c0000374 Windows在test.exe中觸發了一個斷點。
這可能是由於堆的損壞,這表明test.exe或它已加載的任何DLL中存在一個錯誤。
這也可能是由於用戶在test.exe具有焦點時按下F12。
如果我已經爲Win32正確地分配,使用和釋放了內存,爲什麼它對於x64會有所不同?
在Win64上,int的確是32位,而指針是64位。 –