c - 在这种情况下如何正确释放双指针的内存?
问题描述
我的程序是通过创建具有新大小的新 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;
}
解决方案
这里有两个问题。
首先,您只复制一个结构,而不是整个数组:
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;
推荐阅读
- java - 为什么我的 Scanner 不能使用 2 个不同的 if 语句?
- php - 查询解决方案
- c# - 带有 SkiaSharp 的 UWP ScrollViewer.TopHeader 不绘图
- python - 如何从列表中打印出每 50 个值?
- node.js - 在一次 api 调用中保存到多个数据库时返回状态
- javascript - 动态加载 JavaScript 库并调用
- javascript - 未找到 aws 配置凭据
- ubuntu - Puppeteer:使用 WebGL 的页面在 Ubuntu 服务器上需要 70 秒才能完成,而在 Windows 桌面上需要 1 秒
- python - 在 Termux 安卓终端模拟器上安装 python3.6
- sql - 两个日期之间的差异,一个日期作为没有时区的时间戳