HI我试图从输入文件中读取一些数据,并将它们构造为一个名为packet的结构,然后将其写入我的输出文件。程序本身在获得正确输出方面运行良好。然而,当运行带有"valgrind"的程序来检查内存泄漏时,内存在malloc内存的行I处泄漏。我尝试在循环外释放它们,如下所示,但编译器无法识别p:"error: 'p' undeclared (first use in this function)"
。如果我在while循环内释放它们,我将出现Segmentation错误。我该怎么办?谢谢
-
就像错误消息所说的那样,在循环之后使用一个名为
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->payload
磁盘的p->block_size
字节,但p->payload
的大小是nread
。(实际上,p->block_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);
}