Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
无法释放C中循环外部的指针?_C_File_Memory_Struct_Malloc - Fatal编程技术网

无法释放C中循环外部的指针?

无法释放C中循环外部的指针?,c,file,memory,struct,malloc,C,File,Memory,Struct,Malloc,嗨,我试着从一个输入文件中读取一些数据,并将它们构造成一个名为packet的结构,然后将其写入我的输出文件。程序本身在获得正确输出方面运行良好。但是,当使用“valgrind”运行程序以检查内存泄漏时,内存在I行malloc memories处泄漏。我试图像下面这样在循环外释放它们,但编译器无法识别p:“错误:p未声明(首次在此函数中使用)”如果我在while循环内释放它们,则会出现分段错误。我该怎么办?谢谢 正如错误消息所说,在循环之后使用名为p的变量,但代码中唯一名为p的变量仅存在于循环中。

嗨,我试着从一个输入文件中读取一些数据,并将它们构造成一个名为packet的结构,然后将其写入我的输出文件。程序本身在获得正确输出方面运行良好。但是,当使用“valgrind”运行程序以检查内存泄漏时,内存在I行malloc memories处泄漏。我试图像下面这样在循环外释放它们,但编译器无法识别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)在循环内,在上次写入后添加到答案中。我想这就是所有的问题。天哪,你太棒了。非常感谢,我将尝试修复它们。您是否尝试写入长度前缀块?请参阅底部的“添加”。