gpt4 book ai didi

c - free() 然后再 malloc()

转载 作者:行者123 更新时间:2023-12-02 08:35:47 25 4
gpt4 key购买 nike

我在减少指针分配的内存时遇到困难。这样做是因为此指针指向一个 char 数组,该数组将存储字节,但字节数可以不同。

使用了以下结构:

struct packet {
unsigned char *data
}

在我的代码中,我首先为数据包和数据分配内存:

struct packet *pack;
pack = malloc(sizeof(struct packet));
pack->data = malloc(MAXSIZE);

MAXSIZE 是一次读取的最大大小(256 字节)。

使用缓冲区读取文件并使用以下命令将数据设置到缓冲区后:pack->data= &buffer,我读取文件中剩余的字节(使用 stat() 计算并减去 MAXSIZE每次直到我们剩下的少于 MAXSIZE。)

在这一点上,我想让数据指针分配比 MAXSIZE 更少的内存,因为数据不会那么大,我尝试了以下代码但它失败并导致“核心转储”:

free(pack->data);
printf("Memory freed.") // This never gets printed so there is an issue with free...
pack->data = malloc(remaining_size);

remaining_size 计算正确,所以我知道它应该正确分配。我采取了错误的方法吗?我也试过 realloc() 但我得到了相同的结果。

真的很感激一些帮助,这是一个普遍的问题,但我需要类似的东西来处理一个需要释放所有内存的学校项目。如果我能解决这个问题,我应该能够释放内存。谢谢!

编辑:如果我删除 free() 调用并再次简单地调用 malloc(),它会起作用,但我认为这是错误的方法,因为旧分配的空间永远消失了,我永远无法释放它。

最佳答案

pack->data = &buffer;

执行该行后,data 将保存变量buffer 的地址。它将不再保留它之前保留的堆上的地址(如果您不在其他地方保留该地址,该地址现在会泄露)。然而,free 仅适用于堆上的地址,因此在 pack->data 上调用 free 会调用未定义的行为。

关于c - free() 然后再 malloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21788287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com