解决 `./recover' 中的错误:free(): invalid next size (normal): 0x0000000001ddd270 *** Aborted in c
Solving Error in `./recover': free(): invalid next size (normal): 0x0000000001ddd270 *** Aborted in c
代码必须一次从包含原始 JPEG 的文件中读取 512 个字节才能检索它们。当找到一个 JPEG 时,将以下所有 512 字节的块存储在一个文件中,直到找到一个新的 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));
首先,card是FILE *
,所以这里分配的是一个指针,而不是FILE
。其次,您不能以这种方式打开文件。您必须使用 fopen()
或类似的东西。
你怎么看
FILE *buffer1 = malloc(sizeof(card));
正在干什么?它实际上是在创建一个 4 或 8 字节长的缓冲区。 (文件的大小 * )。你被告知一次读取 512 个字节。它是一个 char * 缓冲区而不是 FILE *。怎么样。
char *buffer1 = malloc(512);
代码必须一次从包含原始 JPEG 的文件中读取 512 个字节才能检索它们。当找到一个 JPEG 时,将以下所有 512 字节的块存储在一个文件中,直到找到一个新的 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));
首先,card是FILE *
,所以这里分配的是一个指针,而不是FILE
。其次,您不能以这种方式打开文件。您必须使用 fopen()
或类似的东西。
你怎么看
FILE *buffer1 = malloc(sizeof(card));
正在干什么?它实际上是在创建一个 4 或 8 字节长的缓冲区。 (文件的大小 * )。你被告知一次读取 512 个字节。它是一个 char * 缓冲区而不是 FILE *。怎么样。
char *buffer1 = malloc(512);