2015-03-13 2 views
0

Я пытаюсь реализовать функцию сортировки (подсчет сортировки, это, вероятно, неправильно):Проблемы с динамическим распределением памяти в C

void countingsortmm(int* numbers, int len, int min, int max) { 
    printf("Sorting %d integers with the min: %d and max: %d\n",len,min,max); 

    int countLen = max-min+1; 
    /* create an array to store counts for the occurences of a number. */ 
    int* countingArray = (int*)malloc(countLen); 

    /* init all values to 0 */ 
    for(int i = 0; i < countLen; i++) countingArray[i] = 0; 
    /* increment at indexes where a number occurs */ 
    for(int i = 0; i < len; i++) countingArray[numbers[i]]++; 
    /* add previous indexes */ 
    for(int i = 1; i < countLen; i++) countingArray[i] += countingArray[i-1]; 

    /* Array where numbers will be places in a sorted order. */ 
    int* sortedArray = (int*)malloc(len); 
    /* put numbers in proper place in new array and decrement */ 
    for(int i = len-1; i >= 0; i--) sortedArray[countingArray[numbers[i]]--] = numbers[i]; 
    /* copy contents of new sorted array to the numbers parameter. */ 
    for(int i = 0; i < len-1; i++) numbers[i] = sortedArray[i]; 

    free(sortedArray); 
    free(countingArray); 
} 

Но я получаю следующее сообщение об ошибке:

malloc: *** error for object 0x7f8728404b88: incorrect checksum for freed object - object was probably modified after being freed.

Получаю очко в int* sortedArray = (int*)malloc(len);.

Я использую malloc() дважды, чтобы создать два различных массивов в пределах функции, и я не free() их обоих в конце функции, когда они больше не нужны. После этого я не буду явно изменять или получать доступ к их содержимому.

Так что же вызывает эту проблему?

+0

@Cornstalks: Почему вы не ответили вместо этого своим комментарием, понимая, как это действительно правильный ответ? :) – Dolda2000

+1

@ Dolda2000: Я не уверен ... Полагаю, мне было слишком лениво прокручивать лишнюю сумму в зону ответа? – Cornstalks

+2

, пожалуйста, [не использовать] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) возвращаемое значение 'malloc()'. –

ответ

3

Это значит, что вы развращаете свою кучу. Возможно, вы имели в виду malloc(countLen * sizeof(int)); и malloc(len * sizeof(int));? malloc принимает размер в байтах.

Смежные вопросы