Моя программа вылетает всякий раз, когда я пытаюсь освободить старую память - PullRequest
0 голосов
/ 19 января 2019

, так что в основном есть функция, которая выделяет новую память указателя, и когда я пытаюсь перенести старый, программа в основном вылетает мой код

char** AddingToTheBook(char** original, int* size, char *number)
{
    char** newArray = (char**)malloc(sizeof(char*)*(*size));
    //allocating and copying the values
    for (int i = 0; i < *size; i++)
    {
        *(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))));
        strcpy(*(newArray + i), *(original + i));
    }

    //allocating a new memory to the new number
    *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number));
    strcpy(*(newArray + (*size)), number);
    (*size)++;
    //delocating the allocated memories 
    for (int i = 0; i < size; i++)
        free(original[i]);
    free(original);

    return newArray;
}

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы освобождаете слишком много своей исходной памяти.

Посмотрите на цикл for, когда вы освобождаете память:

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < size; i++)
    free(original[i]);

, поскольку size является int *у вас будет очень большое количество итераций, которые позволят освободить гораздо больше памяти, чем было выделено.Чтобы это исправить, сделайте следующее:

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < *size; i++)
    free(original[i]);

Теперь вы по-прежнему освобождаете один элемент слишком сильно, поскольку увеличиваете * размер при добавлении нового элемента.Окончательная версия для освобождения оригинальной памяти:

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < *size - 1; i++)
    free(original[i]);
0 голосов
/ 19 января 2019

Вместо него можно использовать realloc

char** AddingToTheBook(char** original, size_t oldsize, char *number)
{
    char** tmp = realloc(**original, (oldsize  + 1) * sizeof(char *));

    if(tmp)
    {
        tmp[oldsize] = malloc(strlen(number) + 1'
        if(tmp[oldsize])
        {
            strcpy(tmp[oldsize], number);
        }
        else
        {
            /* do something for example realloc back to the old size */
            tmp = NULL;
        }
    }
    return tmp;
}

пример правильного использования

    char **tmp = AddingToTheBook(book, size, "Test String")

    if(tmp)
    {
        book = tmp;
        size++;
    }
    else
    {
        /* do something adding to book failed */
    }
0 голосов
/ 19 января 2019
  1. strlen возвращает только количество символов.Освободите место для конечного нуля *(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))) +1);
  2. Лучше strncpy вместо strcpy

  3. Как продвинуться *size вперед в newArray: *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number)); Вы можете идти только вперед *size -1, поскольку он начинается с нуля.

  4. В цикле for, кажется, вы забыли добавить звездочку * for (int i = 0; i < size; i++)

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