C: MSVC2008 Malloc и сбой программы - PullRequest
0 голосов
/ 16 июля 2010

Этот вопрос может быть исправлен, но у меня много проблем с malloc.Почему происходит сбой моей программы при освобождении памяти?

#include <stdlib.h>
#include <malloc.h>
int main(int argc, char *argv[]) {
    int *arr[10];
    void *mem = malloc( 10 * sizeof(int) );
    int i;
    for(i=0;i<=9;i++) {
        arr[i] = (int*) mem + i*sizeof(int);
        *arr[i]= 9-i;
    }
    //void** ar = (void**) arr;
    //medianSort(ar, cmp, 0, 9);
    free(mem); //crashes here
    return 0;
}

Отчеты о сообщениях об ошибках во время выполнения :

Windows вызывает точку останова в medianSort.exe.Это может быть связано с повреждением кучи, что указывает на ошибку в файле medianSort.exe или любой из загруженных им библиотек DLL.Это также может быть связано с тем, что пользователь нажимает клавишу F12, в то время как файл medianSort.exe находится в фокусе.В окне вывода может быть больше диагностической информации.

Ниже приведен блок ошибок из malloc.c :

#ifdef _WIN64
    return HeapAlloc(_crtheap, 0, size ? size : 1);
#else  /* _WIN64 */
    if (__active_heap == __SYSTEM_HEAP) {
        return HeapAlloc(_crtheap, 0, size ? size : 1); //crashes here
    } else
    if ( __active_heap == __V6_HEAP ) {
        if (pvReturn = V6_HeapAlloc(size)) {
            return pvReturn;
        }
    }

1 Ответ

0 голосов
/ 16 июля 2010

Вы пишете за пределами выделенной памяти.Обратите внимание, что (int*) mem является указателем int, поэтому добавление 1 фактически перемещает ячейку памяти на sizeof(int) байтов.Другими словами, вам не следует делать sizeof(int) внутри цикла, потому что арифметика с указателями говорит, что компилятор сделает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...