无法释放C中循环外部的指针?
嗨,我试着从一个输入文件中读取一些数据,并将它们构造成一个名为packet的结构,然后将其写入我的输出文件。程序本身在获得正确输出方面运行良好。但是,当使用“valgrind”运行程序以检查内存泄漏时,内存在I行malloc memories处泄漏。我试图像下面这样在循环外释放它们,但编译器无法识别p:无法释放C中循环外部的指针?,c,file,memory,struct,malloc,C,File,Memory,Struct,Malloc,嗨,我试着从一个输入文件中读取一些数据,并将它们构造成一个名为packet的结构,然后将其写入我的输出文件。程序本身在获得正确输出方面运行良好。但是,当使用“valgrind”运行程序以检查内存泄漏时,内存在I行malloc memories处泄漏。我试图像下面这样在循环外释放它们,但编译器无法识别p:“错误:p未声明(首次在此函数中使用)”如果我在while循环内释放它们,则会出现分段错误。我该怎么办?谢谢 正如错误消息所说,在循环之后使用名为p的变量,但代码中唯一名为p的变量仅存在于循环中。
“错误:p未声明(首次在此函数中使用)”
如果我在while循环内释放它们,则会出现分段错误。我该怎么办?谢谢
p
的变量,但代码中唯一名为p
的变量仅存在于循环中。这可以通过解决下一个问题来解决while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
struct packet *p = malloc(sizeof(struct packet));
p->payload = malloc(sizeof(nread+1));
p->payload = buff;
...
free(p);
free(p->payload);
}
*p
。您的free
呼叫顺序错误
while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
struct packet *p = malloc(sizeof(struct packet));
p->payload = malloc(sizeof(nread+1));
p->payload = buff;
...
free(p->payload);
free(p);
}
nread+1
字节,但您分配sizeof(nread+1)
字节
while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
struct packet *p = malloc(sizeof(struct packet));
p->payload = malloc(nread+1);
p->payload = buff;
...
free(p->payload);
free(p);
}
free(p->payload)
时(如果要将其移动到循环的末尾),p->payload
不再包含指向您分配的缓冲区的指针,因此free(p->payload)
尝试取消分配错误的块。您需要使用另一个变量来跟踪此块
while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
struct packet *p = malloc(sizeof(struct packet));
char* payload = malloc(nread+1);
p->payload = payload;
p->payload = buff;
...
free(payload);
free(p);
}
nread
字节,而不是nread+1
,因为您可能是想将读取的字节复制到缓冲区中p->payload
。p->payload
的内存分配和随后的解除分配似乎完全无用
while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
struct packet *p = malloc(sizeof(struct packet));
p->payload = buff;
...
free(p);
}
while ((nread = fread(buffer, sizeof(char), 256, infp)) > 0) {
struct packet p;
p.payload = buff;
...
}
p->block\u size
字节的p->payload
磁盘,但是p->payload
的大小是nread
。(实际上,p->block\u size
是未初始化的内存。)nread
),这使得代码无法读取您所写的内容我认为您正在尝试编写长度前缀块,其中每个长度前缀都是一个字节长,每个
+---+----- ... -----+---+----- ... -----+---+----- ... -----+...
| i | i bytes | j | j bytes | k | k bytes |
+---+----- ... -----+---+----- ... -----+---+----- ... -----+...
如果是,你想
while ((nread = fread(buffer, sizeof(char), 255, infp)) > 0) {
unsigned char len = (unsigned char)nread;
fwrite(&len, 1, 1, outfp);
fwrite(buffer, 1, nread, outfp);
}
除非在循环之前定义了另一个
p
,否则它甚至不会编译!您需要首先释放有效负载,它需要在循环中。每次调用malloc
,它都是一个新的分配。每个人都必须被单独释放。每malloc
一个free
。正如@ShafikYaghmour所说,你需要免费(p->payload);自由基(p)代码>在循环内,在上次写入后添加到答案中。我想这就是所有的问题。天哪,你太棒了。非常感谢,我将尝试修复它们。您是否尝试写入长度前缀块?请参阅底部的“添加”。