我在减少指针分配的内存方面遇到了困难。这是完成的,因为这个指针指向一个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(),它可以工作,但我相信这是错误的方法,因为旧的分配空间永远消失了,我永远不会释放它。
答案 0 :(得分:6)
pack->data = &buffer;
执行该行后,data
将保留变量buffer
的地址。它将不再保存它先前保存的堆上的地址(如果你没有在其他地方保留它,那么该地址现在会泄露)。但是free
仅适用于堆上的地址,因此在free
上调用pack->data
会调用未定义的行为。