Как правильно освободить память двойного указателя в этом случае? - PullRequest
0 голосов
/ 07 ноября 2018

Моя программа заключается в увеличении размера массива struct путем создания нового arr с новым размером, а затем присвоения двойного указателя старого массива новому. Я боролся с освобождением памяти старого массива до или после назначения его новому. Если я не использую fee (), он даст правильные результаты, в противном случае он автоматически подберет и распечатает некоторые значения корзины. Пожалуйста, помогите, спасибо.

* realloc не допускается.

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

struct car {
    char name[30];
    int quantity;
};

void increaseSize(int *cap, int size, struct car **carArray) {
    printf("cap = %d size = %d\n", *cap, size);
    *cap *= 2;
    printf("cap x 2 = %d\n", *cap);
    struct car *newCarArray = (struct car * ) malloc(*cap * sizeof(struct car));
    memcpy(newCarArray, carArray, sizeof(struct car));
    free(*carArray); // If I free old carArray here, it will give incorrect results. How can I release/clear/delete/free the memory of the old array here?
    carArray = &newCarArray;
    printf("increased cap = %d size = %d\n", *cap, size);
}

void printArray(int cap, int size, struct car *carArray) {
    printf("Capacity = %d, Size = %d \n", cap, size);
    for(int i = 0; i < size; i++) {
        printf("Car %d, Name: %s, Quantity: %d\n", i, carArray[i].name, carArray[i].quantity);
    }
}

int main() {

    int cap = 2;
    int size = 0;
    struct car *carArray = (struct car *) malloc(cap * sizeof(struct car));

    struct car car_0 = {"Corolla", 5};
    carArray[0] = car_0;
    size++;

    struct car car_1 = {"Accord", 8};
    carArray[1] = car_1;
    size++;

    printArray(cap, size, carArray);

    increaseSize(&cap, size, &carArray);

    struct car car_2 = {"Forte", 3};
    carArray[2] = car_2;
    size++;

    printArray(cap, size, carArray);
    free(carArray);

    return 0;
}

1 Ответ

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

Два вопроса здесь.

Во-первых, вы копируете только одну структуру, а не весь массив:

memcpy(newCarArray, carArray, sizeof(struct car));

Здесь вы говорите, что хотите скопировать sizeof(struct car) байтов, что достаточно для одной структуры. Вы также не копируете правильную вещь, так как carArray является указателем на указатель. Вам нужно умножить на исходный размер, чтобы скопировать весь массив, и вам нужно разыменовать carArray:

memcpy(newCarArray, *carArray, (*cap / 2) * sizeof(struct car));

Другая проблема здесь:

carArray = &newCarArray;

Здесь вы изменяете только параметр carArray, поэтому изменения в нем не отражаются в вызывающей программе. Вы должны разыменовать это, как и вы car:

*carArray = newCarArray;
...