为什么C代码可以作为Win32构建工作但是作为x64构建失败?

时间:2011-07-19 17:37:24

标签: c visual-studio-2010 malloc dynamic-memory-allocation heap-memory

我在Windows 7 - 64位,使用VS2010。下面的代码在Win32中构建没有问题并产生预期的结果(两个矩阵为8乘8,所有元素的值为1,第三个8乘8矩阵显示内存地址)。

#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:\ My code \ test \ x64 \ 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文件

     

'test.exe':已加载'C:\ Windows \ System32 \ msvcr100d.dll',已加载符号。

     

检测到严重错误c0000374   Windows在test.exe中触发了断点。

     

这可能是由于堆损坏,这表示test.exe或其加载的任何DLL中存在错误。

     

这也可能是由于用户在test.exe具有焦点时按下F12。

如果我为Win32正确分配,使用和释放内存,为什么x64会有所不同?

3 个答案:

答案 0 :(得分:5)

您的指针数组大小错误。它是一个int*数组,但你只为int分配空间。 sizeof(int) != sizeof(int*)

答案 1 :(得分:4)

你可能没有为array_of_pointers分配足够的空间。您使用sizeof(int)代替sizeof(int *)。在64位上,我猜测int是32位但指针是64位。

此外,在打印%p的元素时,您应该使用%d(而不是array_of_pointers)作为格式说明符。

答案 2 :(得分:3)

问题在于:

    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);
    }
}

您的指针数组的大小就像指针与int的大小相同,它们不在Win64中

试试这个:

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);
    }
}