Malloc прерывается с определенным вводом - PullRequest
0 голосов
/ 07 сентября 2018

Это моя первая публикация здесь, поэтому я прошу прощения, если я не соблюдаю правильный этикет. Я также пытался искать ответы, но безрезультатно.

В принципе, у меня есть эта функция для алгоритма жадного изменения монет, который принимает в качестве входных данных некоторое значение int. В моей функции я возвращаю массив malloc'd, содержащий каждую монету. Хотя это работает по большей части, по какой-то причине любая ценность монеты, которая дает 5, 9, ... (+4) монет в качестве оптимального распределения, то есть 9 будет (5 + 1 + 1 +1 + 1), или 650, то есть 13 монет по 50, заставляет программу прерываться следующим сообщением:

hello: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && 
old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse 
(old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

Тем не менее, каждая раздача монет, которая не 5 или 5 + 4 + ... работает. Не уверен, что делать.

Это функция:

int* greedyAlg(int value)//computes and returns the optimal (minimum) number of denominations for a given value for US currency
    {
        //denominations
        int one = 1, five = 5, ten = 10, twenty = 20, fifty = 50;
        int x5 = 0, x4 = 0, x3 = 0, x2 = 0, x1 = 0;
        int count = 0;
        //int[] denom;

    while(value != 0)
    {
        if(value >= fifty)
        {
            value -= fifty;
            count++;
            x5++;

            /*while(value >= fifty)
            {
                // int *i = &fifty;
                value-=fifty;
                count++;
                x5++;
            }*/
        }
        else if(value < fifty && value >= twenty)
        {
            value -= twenty;
            count++;
            x4++;
        }
        else if(value < twenty && value >= ten)
        {
            value -= ten;
            count++;
            x3++;
        }
        else if(value < ten && value >= five)
        {
            value -= five;
            count++;
            x2++;
        }
        else if(value < five && value >= one)
        {
            value -= one;
            count++;
            x1++;
        }
    }
    //printf("Optimal denominations: ");
    int* denom = malloc(sizeof(int)*(count + 1));
    //int* denom = (int *)calloc(count + 1,sizeof (int));

    denom[0]=count;
    for(int i = 1; i<= (x5 + 1); i++){
        denom[i] = fifty;
    }
    for(int i= (x5 + 1); i<=(x5 + x4) + 1; i++){
        denom[i] = twenty;
    }
    for(int i = (x5 + x4) + 1; i <= ( x5 + x4 +x3 ) + 1; i++){
        denom[i] = ten;
    }
    for(int i = (x5 + x4 + x3) + 1; i <= (x5 + x4 + x3 + x2) + 1; i++){
        denom[i] = five;
    }
    for(int i = (x5 + x4 + x3 + x2) + 1; i <= (x5 + x4 + x3 + x2 + x1) + 1; i++){
        denom[i]=one;
    }
    return denom;
    free(&denom);
    //return count;
}

И вот как я это печатаю:

//prints elements of array created by (greedy) coin change algorithm
void printGreedyArr(int arr[], size_t count)
{
    for(int i = 1; i <= count; i++)
    {
        printf("%s%d%s, ","[",arr[i],"]");
    }
    printf("\n%s %d\n","count was",count);
}

Я называю это с 0-м индексом, который содержит длину следующим образом:

printGreedyArr(greedyAlg(x),greedyAlg(x)[0]);

(В моем коде я настроил цикл с x в качестве пользовательского ввода для проверки)

Я могу опубликовать любую другую соответствующую информацию, если это будет необходимо.

1 Ответ

0 голосов
/ 07 сентября 2018

Предполагая, что count равно x5+x4+x3+x2+x1, вы получаете ошибку «один за другим»:

for(int i=(x5+x4+x3+x2)+1; i<=(x5+x4+x3+x2+x1)+1; i++){

Вероятно, должно быть:

for(int i=(x5+x4+x3+x2)+1; i<(x5+x4+x3+x2+x1)+1; i++){

Аналогично длядругие for петли.Обратите внимание, что условие завершения изменилось с <= на <.

Также:

return denom;
free(&denom);

То, что free() никогда не будет выполнено, а также & следует удалитьдо denom, если вы поместите его в другом месте.

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