strcpy вылетает из программы

Исходный код:

priorityqueue_t * pqueue_create() {

    priorityqueue_t *pq;

    pq = (priorityqueue_t *) malloc(sizeof(priorityqueue_t));

    pq->entries = (pqentry_t **) malloc(4 * sizeof(pqentry_t *));
    pq->last = 0;
    pq->size = 4;
    return pq;
}

void pqueue_insert(priorityqueue_t *pq, char* value, float p) {

    if (isFull(pq)) {
        pq->size *= 2;
        pq->entries = realloc(pq->entries, pq->size * sizeof(pqentry_t *));
    }


    pqentry_t *eintrag = malloc(sizeof(pqentry_t));

    eintrag->pqvalue = (char *) malloc(sizeof(value));
    eintrag->pqvalue = strcpy(eintrag->pqvalue,value);
    //eintrag->pqvalue = value;
    eintrag->priotity = p;

    //hinten einfügen und einsortieren
    pq->entries[pq->last] = eintrag;
    pq->last += 1;
    sortIn(pq,pq->last - 1);

}

static void sortIn (priorityqueue_t *pq, int pos) {

    if (pos >= 1) {
        for (int i = pos; i > 0; --i) {
            if (pq->entries[i-1]->priotity > pq->entries[i]->priotity) {
                pqentry_t *swap = pq->entries[i-1];

                pq->entries[i-1] = pq->entries[i];
                pq->entries[i] = swap;
            }
        }
    }
}

Основной код:

char* randomString (int size) {

    char* str = (char *) malloc((size+1)* sizeof(char));
    for (int i = 0; i < size; ++i) {
        str[i] = (rand() % 26) + 'A';
    }
    str[size] = '\0';
    return str;
}

int main() {

    int i;
    char* strings[MAX];
    clock_t  tic, toc;

    srand(time(NULL));

    for (i = 0; i < MAX; ++i) {
        strings[i] = randomString(8);
    }

    priorityqueue_t *pq = pqueue_create();

    tic = clock();
    for (i = 0; i < MAX; i++){
        pqueue_insert(pq,strings[i],rand() % 100);
    }
    toc = clock();

    printf("insertion time: %.2f \n", (float) (toc-tic) / CLOCKS_PER_SEC);

    tic = clock();
    for (i = 0; i < MAX; i++){
        pqueue_extractMin(pq);
    }
    toc = clock();
    printf("extraction time: %.2f \n", (float) (toc-tic) / CLOCKS_PER_SEC);

    for (i = 0; i < MAX; ++i) {
        free(strings[i]);
    }
    pqueue_destroy(pq);

    return 0;
}

Моя проблема в том, что программа вылетает, когда я пытаюсь вставить второй раз в цикл for. Как ни странно, это работает, когда я делаю это вручную или запускаю программу на своем ноутбуке. Я рад любой помощи.


person Truut    schedule 08.05.2018    source источник
comment
Пожалуйста, прочтите это stackoverflow.com/questions/605845/ о том, почему вы не должны приводить возвращаемое значение из malloc   -  person Ed Heal    schedule 08.05.2018


Ответы (1)


Вы не выделяете достаточно места в этой строке:

eintrag->pqvalue = (char *) malloc(sizeof(value));

Это связано с тем, что value передается в pqueue_insert как char*, поэтому оценка времени компиляции оператора sizeof не выделяет для вас достаточно места. Попробуйте изменить распределение на:

eintrag->pqvalue = malloc(1 + strlen(value));

Обратите внимание, что спецификация C определяет размер char, т.е. 1 байт, поэтому здесь вам не нужен sizeof(char).

person bruceg    schedule 08.05.2018