【问题标题】:How to free memory of a double pointer in this case properly?在这种情况下如何正确释放双指针的内存?
【发布时间】:2018-11-07 14:29:07
【问题描述】:

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

*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;
}

【问题讨论】:

  • 你听说过realloc吗?
  • @FiddlingBits 我不想使用 realloc 因为它是不允许的。
  • carArray = &amp;newCarArray; 应该是*carArray = newCarArray;
  • memcpy(newCarArray, carArray, sizeof(struct car)); 复制 one 结构。更好地学习如何使用realloc
  • @Someprogrammerdude memcpy 甚至可以使用结构数组(已测试)

标签: c memory-leaks malloc free dynamic-memory-allocation


【解决方案1】:

这里有两个问题。

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

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;

【讨论】:

  • 谢谢你的回答,但是上面改了之后,问题依旧,还是打印不正确的结果。
  • @LouisTran 请添加缺少的重要信息:您得到什么输出以及您期望什么。请将其添加到问题中。您还可以在此处添加更新的代码。请不要删除会使所有现有 cmets 和答案无效的旧代码。
  • @LouisTran 您还需要在memcpy 调用中取消引用carArray。查看我的编辑。
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2019-10-05
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多