c - 如何摆脱分段错误?
问题描述
我已经研究了很长时间,但无法弄清楚分段错误的原因。
我感觉多次写入缓冲区有问题,但我不知道任何替代方法。或者它可能是内存分配的问题。
这是代码。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if(argc != 2)
{
fprintf(stderr, "Usage: ./recover filename\n");
return 1;
}
FILE* file = fopen(argv[1], "r");
if(!file)
{
fprintf(stderr, "No file found\n");
return 2;
}
fseek(file, 0, SEEK_SET);
unsigned char buffer[512];
int counter = 0;
char imagename[8];
FILE* image;
while(fread(buffer, 512, 1, file) == 1)
{
if(buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
(buffer[0] & 0xf0) == 0xe0 )
{
if(counter > 0)
{
fclose(image);
}
sprintf(imagename, "%03i.jpg", counter);
image = fopen(imagename, "w");
if(!image)
{
fprintf(stderr, "No file found\n");
return 2;
}
fwrite(buffer, 512, 1, image);
printf("%i", counter);
counter++;
}
else if(counter > 0)
{
fwrite(buffer, 512, 1, image);
}
}
fclose(image);
fclose(file);
free(image);
return 0;
}
解决方案
我没有收到任何分段错误,但我认为您误会了该fread
功能。
返回值 成功读取的元素总数作为 size_t 对象返回,它是一个整数数据类型。如果此数字与 nmemb 参数不同,则说明发生错误或到达文件结尾。
所以我不知道你是否进入了循环,或者你期待不同的东西。
你可以这样做while(fread(buffer, 512, 1, file))
: