Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
free()然后再次使用malloc()_C_Pointers_Memory_Memory Management - Fatal编程技术网

free()然后再次使用malloc()

free()然后再次使用malloc(),c,pointers,memory,memory-management,C,Pointers,Memory,Memory Management,我很难减少指针分配的内存。这是因为该指针指向一个字符数组,该数组将存储字节,但字节数可能不同 使用以下结构: struct packet { unsigned char *data } 在我的代码中,我首先为数据包和数据分配内存: struct packet *pack; pack = malloc(sizeof(struct packet)); pack->data = malloc(MAXSIZE); MAXSIZE是一次读取的最大大小(256字节) 在使用缓冲区读取文件并使

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

使用以下结构:

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,因为数据不会那么大,我尝试了以下代码,但失败了,导致“内核转储”:

剩余的_大小计算正确,因此我知道它应该正确分配。我是不是走错了路?我也尝试了
realloc()
,但得到了相同的结果

非常感谢您的帮助,这是一个普遍的问题,但我需要一些类似于学校项目的工作,需要释放所有内存。如果我能解决这个问题,我应该能够释放内存。谢谢

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

pack->data = &buffer;

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

pack->payload=&buffer
您的意思是
data
而不是
payload
还是您的数据包结构实际上有两个成员,我的意思是使用数据而不是有效载荷。payload是我们项目中使用的指针,但我试图让这个问题更一般化,因为我仍然希望从项目中学习,而不是简单地得到答案。也许在免费之前放一个
printf
,这样我们就可以确定它是免费的了?它可能是关于
pack->data
的,而不是
free
。可能在代码中的某个地方更改了指向其他内容的指针的值。@Abubakr:这可能是由于输出缓冲。您可能希望
fread(pack->data,…)
。或者
memcpy(pack->data,buffer,…)
Ah。这很有道理,谢谢字符缓冲区[256];'使用“fread(&buffer,…”)对其进行馈送。我应该直接使用'pack->data=buffer'吗?好的,简单地使用'pack->data=buffer'似乎是可行的。谢谢我非常感谢您的帮助。@Abubakr,出于同样的原因,这仍然是未定义的行为。仅允许对
malloc
的结果使用
free
,并且
buffer
&buffer
都不是
malloc
的结果。我不知道为什么它会起作用。您应该做的是将
fread
放入
pack->data
。如果我使用“memcpy(pack->data,buffer,…”,也可以吗?我在缓冲区上使用了'fread()',因为我总是读取MAXSIZE,但最终读取的大小可能更低。最后,我创建了另一个“char remaining[remaining_size]”,然后将“memcpy”缓冲区设置为该缓冲区,然后设置“pack->data=remaining”。我想使用'memcpy'会更好,因为我可以看到同样的错误发生。@Abubakr:您可能希望等到
fread
之后再执行
malloc
,然后使用
fread
的结果作为分配的大小和
memcpy
。那么每个分配都是完美的。
pack->data = &buffer;