Почему код на C работает как сборка Win32, но как x64? - PullRequest
2 голосов
/ 19 июля 2011

Я на Windows 7 - 64bit, используя 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: \ Mycode \ 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.

Это также может быть связано с тем, что пользователь нажимает клавишу F12, когда у test.exe есть фокус.

Если я правильно выделил, использовал и освободил память для Win32, почему бы это сделать?ifferent для x64?

Ответы [ 3 ]

5 голосов
/ 19 июля 2011

Ваш массив указателей имеет неправильный размер.Это массив int*, но вы выделяете место только для int.sizeof(int) != sizeof(int*)

4 голосов
/ 19 июля 2011

Возможно, вы не выделяете достаточно места для array_of_pointers. Вы используете sizeof(int) вместо sizeof(int *). На 64-битной, я предполагаю, что int это 32-битные, но указатели 64-битные.

Кроме того, вы должны использовать %p (вместо %d) в качестве спецификатора формата при печати элементов array_of_pointers.

3 голосов
/ 19 июля 2011

Проблема здесь:

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

Ваш массив указателей имеет такой же размер, как если бы указатели были того же размера, что и целые, которых нет в 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...