Освобождение arr возвращает ошибку malloc: *** ошибка для освобождаемого указателя объекта не была выделена

#c #malloc

#c #malloc

Вопрос:

Я пытаюсь написать функцию, которая принимает 2 массива и их размер (оба одинакового размера) и возвращает массив, в котором каждое число из первого массива появляется столько раз, сколько раз в одном и том же индексе во втором массиве. Пример: ввод: {2,5,3,7,8},{5,2,0,4,3},5 вывод: {2,2,2,2,2,5,5,7,7,7,7,8,8,8}

Мой текущий код:

 #include <stdio.h>
#include <stdlib.h>

int* blowUpArray(int numArray[], int amountArray[], int size);
int* reallocateArr(int* arr, int currLogSize, int newSize);

int main() {
    int arr1[] = {2,5,3,7,8},arr2[] = {5,2,0,4,3}
    int* res;
    res = blowUpArray(arr1,arr2,5);
    for (int i = 0; i < 14; i  )
        printf("%d ", res[i]);
    return 0;
}

int* blowUpArray(int numArray[], int amountArray[], int size)
{
    int i = 0,currSize = 0,j;
    int* blownUp;
    while (i < size)
    {
        blownUp = reallocateArr(numArray,currSize,amountArray[i]);
        for (j = currSize; j < currSize   amountArray[i]; j  )
        {
            blownUp[j] = numArray[i];
        }
        currSize = currSize   amountArray[i];
        i  ;
    }
    return blownUp;
}

int* reallocateArr(int* arr, int currLogSize, int addedSize)
{
    int* newArr;
    int i;

    newArr = (int*)malloc((currLogSize   addedSize) * sizeof(int));

    if (newArr == NULL)
    {
        printf("Memory allocation failed.n");
        exit(1);
    }

    for (i = 0; i < currLogSize; i  )
        newArr[i] = arr[i];

    free(arr);

    return newArr;
}
 

Я получаю эту ошибку:

 malloc: *** error for object 0x7ffee644b6f0: pointer being freed was not allocated
malloc: *** set a breakpoint in malloc_error_break to debug
 

Есть идеи?

Ответ №1:

reallocateArr Функция освобождает arr параметр. Он вызывается следующим образом:

 reallocateArr(numArray,currSize,amountArray[i]);
 

Где numArray параметр функции blowUpArray , которая вызывается следующим образом:

 res = blowUpArray(arr1,arr2,5);
 

Где arr — массив, локальный для main функции. Поскольку этот массив был объявлен как локальная переменная, вы не можете передать его free .

Вы, вероятно, хотели перейти blownUp к reallocateArr :

 reallocateArr(blownUp,currSize,amountArray[i]);
 

Вы также должны инициализировать эту переменную, чтобы NULL :

 int* blownUp = NULL;
 

Таким образом, вы можете безопасно передать его free на первой итерации цикла blowUpArray .