Abu*_*akr 2 c memory pointers memory-management
我在减少指针分配的内存方面遇到了困难.这是完成的,因为这个指针指向一个char数组,它将存储字节,但字节数可以不同.
使用以下结构:
struct packet {
unsigned char *data
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我首先为数据包和数据分配内存:
struct packet *pack;
pack = malloc(sizeof(struct packet));
pack->data = malloc(MAXSIZE);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
remaining_size是正确计算的,所以我知道它应该正确分配.我采取了错误的做法吗?我也尝试了,realloc()但我得到了相同的结果.
非常感谢一些帮助,这是一个普遍的问题,但我需要一些类似于学校项目的工作,需要释放所有内存.如果我能解决这个问题,我应该能够释放内存.谢谢!
编辑:如果我删除free()调用,再次只是malloc(),它可以工作,但我相信这是错误的方法,因为旧的分配空间永远消失,我永远不会释放它.
pack->data = &buffer;
Run Code Online (Sandbox Code Playgroud)
执行该行后,data将保存变量的地址buffer.它将不再保存它先前保存的堆上的地址(如果你没有在其他地方保留它,那么该地址现在就会泄露).但是free只有在堆地址的作品,因此调用free上pack->data调用未定义的行为.