首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >free()然后是malloc()

free()然后是malloc()
EN

Stack Overflow用户
提问于 2014-02-14 19:47:45
回答 1查看 1.8K关注 0票数 2

我很难减少指针分配的内存。这是因为这个指针指向一个char数组,它将存储字节,但是字节数可能有所不同。

使用了以下结构:

代码语言:javascript
复制
struct packet {
   unsigned char *data
}

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

代码语言:javascript
复制
struct packet *pack;
pack = malloc(sizeof(struct packet));
pack->data = malloc(MAXSIZE);

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

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

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

代码语言:javascript
复制
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(),但是我得到了同样的结果。

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

编辑:如果我再次删除空闲()调用并简单地删除malloc(),那么它就能工作,但我认为这是错误的方法,因为旧的分配空间已经永远消失了,而且我永远无法释放它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 19:53:34

代码语言:javascript
复制
pack->data = &buffer;

执行该行后,data将保存变量buffer的地址。它将不再保存它以前持有的堆中的地址(如果您不将该地址保存在其他地方,则该地址现在已泄漏)。但是,free只适用于堆上的地址,因此调用pack->data上的free会调用未定义的行为。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21788287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档