free()然后再次malloc()

时间:2014-02-14 19:47:46

标签: c pointers memory memory-management

我在减少指针分配的内存方面遇到了困难。这是完成的,因为这个指针指向一个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更少的内存,因为数据不会那么大,我尝试以下代码但它失败并导致“core dumped”:

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(),它可以工作,但我相信这是错误的方法,因为旧的分配空间永远消失了,我永远不会释放它。

1 个答案:

答案 0 :(得分:6)

pack->data = &buffer;

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