代码之家  ›  专栏  ›  技术社区  ›  Louis Tran

在这种情况下如何正确释放双指针的内存?

  •  2
  • Louis Tran  · 技术社区  · 6 年前

    我的程序是通过创建新的arr来增加结构数组的大小,然后将旧数组的双指针赋给新数组。在将旧数组分配给新数组之前或之后,我一直在努力释放它的内存。如果我不收费(),它会给出正确的结果,否则,它会自动拾取并打印一些垃圾值。请帮忙,谢谢。

    *不允许重新分配。

    #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 回复  |  直到 6 年前
        1
  •  4
  •   dbush    6 年前

    这里有两个问题。

    首先,你只是在复制 单一的 结构,而不是整个数组:

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

    在这里,你是说抄袭 sizeof(struct car) 字节,对于一个结构来说已经足够了。你也没抄对,因为 carArray 是指向指针的指针。要复制整个数组,需要乘以原始大小,并且需要取消引用 卡拉雷 以下内容:

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

    另一个问题是:

    carArray = &newCarArray;
    

    在这里,您只需修改参数 卡拉雷 ,因此对它的更改不会反映在调用方中。你需要像这样取消引用 car 以下内容:

    *carArray = newCarArray;