c - 解决 `./recover' : free(): invalid next size (normal): 0x0000000001ddd270 *** Aborted in c 中的错误

标签 c file-io cs50 fclose

代码必须一次从包含原始 JPEG 的文件中读取 512 个字节才能检索它们。当找到一个 JPEG 时,接下来的所有 512 字节 block 都将存储在一个文件中,直到找到新的 JPEG,一旦找到新的 JPEG,文件 img 将被关闭,然后作为新文件打开以存储新图像。如果我注释或删除 fclose(img); ,代码运行正常;行,否则会显示上面的错误。

这是代码

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>


int main (int argc, char *argv[]){

if(argc != 2){

    fprintf(stderr, "Usage: ./recovery image\n");
    return 1;

}

FILE *card = fopen(argv[1], "r");

if (card == NULL){

    fprintf(stderr, "Cannot open image\n");
    return 2;

}

FILE *buffer1 = malloc(sizeof(card));

int n = 0;
int picsNum = 0;

while(fread(buffer1, 512, 1, card)){

    n ++;

}

//printf("%i", n);

bool foundJPEG = false;
int j = 0;
bool fstJPEG = false;
FILE *img = NULL;
int counter = 0;

fseek(card, 0, SEEK_SET);

for(int i = 0; i < n; i++){


    unsigned char fst;
    unsigned char snd;
    unsigned char thrd;
    unsigned char fth;
    unsigned char buffer2[508];

    fread(&fst, 1, 1, card);
    fread(&snd, 1, 1, card);
    fread(&thrd, 1, 1, card);
    fread(&fth, 1, 1, card);
    fread(buffer2, 508, 1, card);
    //printf("%i,%i,%i,%i,", fst, snd, thrd, fth);

    if(fst == 0xff && snd == 0xd8 && thrd == 0xff && (fth & 0xf0) == 0xe0){

        printf("Found\n");

        if(fstJPEG){

            fclose(img);

        }

        printf("%i,%i,%i,%i,", fst, snd, thrd, fth);
        foundJPEG = true;
        picsNum++;
        fstJPEG = true;

        char JPEG[8];
        sprintf(JPEG, "%03i.jpg", j);
        j++;
        img = fopen(JPEG, "w");

    } else {

        foundJPEG = false;

    }

    if(fstJPEG){

        fwrite(&fst, 1, 1, card);
        fwrite(&snd, 1, 1, card);
        fwrite(&thrd, 1, 1, card);
        fwrite(&fth, 1, 1, card);
        fwrite(buffer2, 508, 1, card);
        counter++;
        printf("%i,", counter);

    }

}    

fclose(card);    
printf("%i,\n", picsNum);

}

最佳答案

你觉得怎么样

FILE *buffer1 = malloc(sizeof(card));

在做什么?它实际上是创建一个 4 或 8 字节长的缓冲区。 (FILE * 的大小)。您被告知一次读取 512 个字节。它是 char * 缓冲区而不是 FILE *。怎么样?

char *buffer1 = malloc(512);

关于c - 解决 `./recover' : free(): invalid next size (normal): 0x0000000001ddd270 *** Aborted in c 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45684175/

相关文章:

android - 将 URL 转换为文件名的简单方法

c - 您如何理解 mlockall 手册页?

c - 《Head First C》一书中demo中的一个strstr()和fgets()的问题

c++ - memcpy -- 将 uint64 复制到 char *

c# - 使用 C# 在 uTorrent 中打开 torrent 文件

c++ - 二进制文件的 ifstream 与 fread

python - 是否有C相当于Python的: if __name__ == '__main__' : to write main() at the top of the file?

c - C 中简单 for 循环中的预期标识符或 '('

c++ - 如何测试使用我可以使用的 MPI 调用 : is there any set of mock functions, 的 C\C++ 代码?

CS50 Mario Pyramid - 代码有效,但运行 check50 时仍然出现错误