Realloc внутри функции - поврежденный размер по сравнению с prev_size - PullRequest
0 голосов
/ 23 декабря 2018

Я решил выучить C и C ++, но я борюсь с простой задачей и не могу разобраться с ней.Я был бы очень признателен за помощь.

В одной из моих функций я делаю указатель * linesLenght и вызываю другую функцию для выделения памяти и заполнения массива.В одной из функций происходит перераспределение, которое происходит 1-3 раза.В первый раз все идет как надо.Но при перераспределении со 2-й попытки я получаю поврежденный размер по сравнению с предыдущей ошибкой.

Код:

1-й.функция

char * wordWrap (int width, const char * src ){
ulong len = strlen(src);
ulong lines = getLines(width,len);
int * linesLenght = getLinesLen(&lines, src, len, width);
... }

2-я функция

int * getLinesLen(ulong * lines, const char * src, ulong srcLen, int maxLine){
    int * linesLen = malloc((*lines) * sizeof(int));
    ulong counter = 0;

    for(int i = 0; i < srcLen; i++)
    {
            ///other hidden logic....
            if(counter == *lines)
            {
                printf("out! Must resize\n");
                resizeLinesArr(counter + 1, &linesLen);
                *lines += 1;
            }
    }
    *lines = counter;
    return linesLen;
}

3-й функтин (ЗДЕСЬ Я ПОЛУЧИЛ ОШИБКУ)

void resizeLinesArr(ulong arrLen, int ** arr)
{
    int * tmp = realloc(*arr, arrLen * sizeof(int));

    if(tmp == NULL)
    {
        printf("realloc problem\n");
        free(*arr);
        exit(1);
    }
    else
    {
        *arr = tmp;
    }
}

1 Ответ

0 голосов
/ 24 декабря 2018

Эта ошибка:

corrupted size vs. prev_size

- это ошибка, которую malloc (или realloc) печатает, когда его внутренние переменные хранения записей были повреждены.Проблема почти наверняка не в том, что вызывает realloc.В какой-то момент вы либо:

  1. Записываете за конец выделенного кучи буфера, либо перед началом.
  2. Продолжаете использовать указатель после free() этого.

Подобные вещи обычно довольно сложно отследить.Я предлагаю вам попробовать запустить программу с использованием valgrind.Сначала добавьте -g в список параметров, передаваемых компилятору.Это включает отладочную информацию, которая позволяет Valgrind давать вам номера строк, а не только имена функций.

Затем запустите вашу программу так:

valgrind ./your_program

Valgrind будет проверять каждый доступ к памяти и проверятьесли это нарушает два правила, которые я описал выше.

...